w-json-stream 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";function Z(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=Z(l);function m(l){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l},m(l)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function b(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var G=b((function(l,Z){l.exports=function(l){function Z(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function d(l){return function(l){if(Array.isArray(l))return Z(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return Z(l,d);var m=Object.prototype.toString.call(l).slice(8,-1);return"Object"===m&&l.constructor&&(m=l.constructor.name),"Map"===m||"Set"===m?Array.from(l):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?Z(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function b(l,Z,d,m,b,G,c){try{var X=l[G](c),W=X.value}catch(l){return void d(l)}X.done?Z(W):Promise.resolve(W).then(m,b)}function G(l){return function(){var Z=this,d=arguments;return new Promise((function(m,G){var c=l.apply(Z,d);function X(l){b(c,m,G,X,W,"next",l)}function W(l){b(c,m,G,X,W,"throw",l)}X(void 0)}))}}function c(l){return c="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},c(l)}function X(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var W,u=X((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,b="function"==typeof Symbol?Symbol:{},G=b.iterator||"@@iterator",X=b.asyncIterator||"@@asyncIterator",W=b.toStringTag||"@@toStringTag";function u(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{u({},"")}catch(l){u=function(l,Z,d){return l[Z]=d}}function i(l,Z,d,m){var b=Z&&Z.prototype instanceof Y?Z:Y,G=Object.create(b.prototype),c=new t(m||[]);return G._invoke=function(l,Z,d){var m=p;return function(b,G){if(m===h)throw new Error("Generator is already running");if(m===I){if("throw"===b)throw G;return g()}for(d.method=b,d.arg=G;;){var c=d.delegate;if(c){var X=S(c,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===p)throw m=I,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=h;var W=y(l,Z,d);if("normal"===W.type){if(m=d.done?I:V,W.arg===a)continue;return{value:W.arg,done:d.done}}"throw"===W.type&&(m=I,d.method="throw",d.arg=W.arg)}}}(l,d,c),G}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=i;var p="suspendedStart",V="suspendedYield",h="executing",I="completed",a={};function Y(){}function R(){}function K(){}var o={};u(o,G,(function(){return this}));var L=Object.getPrototypeOf,n=L&&L(L(T([])));n&&n!==d&&m.call(n,G)&&(o=n);var J=K.prototype=Y.prototype=Object.create(o);function s(l){["next","throw","return"].forEach((function(Z){u(l,Z,(function(l){return this._invoke(Z,l)}))}))}function H(l,Z){function d(b,G,X,W){var u=y(l[b],l,G);if("throw"!==u.type){var i=u.arg,p=i.value;return p&&"object"===c(p)&&m.call(p,"__await")?Z.resolve(p.__await).then((function(l){d("next",l,X,W)}),(function(l){d("throw",l,X,W)})):Z.resolve(p).then((function(l){i.value=l,X(i)}),(function(l){return d("throw",l,X,W)}))}W(u.arg)}var b;this._invoke=function(l,m){function G(){return new Z((function(Z,b){d(l,m,Z,b)}))}return b=b?b.then(G,G):G()}}function S(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,S(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var b=y(m,l.iterator,d.arg);if("throw"===b.type)return d.method="throw",d.arg=b.arg,d.delegate=null,a;var G=b.arg;return G?G.done?(d[l.resultName]=G.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):G:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function C(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function x(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function t(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(C,this),this.reset(!0)}function T(l){if(l){var d=l[G];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var b=-1,c=function d(){for(;++b<l.length;)if(m.call(l,b))return d.value=l[b],d.done=!1,d;return d.value=Z,d.done=!0,d};return c.next=c}}return{next:g}}function g(){return{value:Z,done:!0}}return R.prototype=K,u(J,"constructor",K),u(K,"constructor",R),R.displayName=u(K,W,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===R||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,u(l,W,"GeneratorFunction")),l.prototype=Object.create(J),l},l.awrap=function(l){return{__await:l}},s(H.prototype),u(H.prototype,X,(function(){return this})),l.AsyncIterator=H,l.async=function(Z,d,m,b,G){void 0===G&&(G=Promise);var c=new H(i(Z,d,m,b),G);return l.isGeneratorFunction(d)?c:c.next().then((function(l){return l.done?l.value:c.next()}))},s(J),u(J,W,"Generator"),u(J,G,(function(){return this})),u(J,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,t.prototype={constructor:t,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(x),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function b(m,b){return X.type="throw",X.arg=l,d.next=m,b&&(d.method="next",d.arg=Z),!!b}for(var G=this.tryEntries.length-1;G>=0;--G){var c=this.tryEntries[G],X=c.completion;if("root"===c.tryLoc)return b("end");if(c.tryLoc<=this.prev){var W=m.call(c,"catchLoc"),u=m.call(c,"finallyLoc");if(W&&u){if(this.prev<c.catchLoc)return b(c.catchLoc,!0);if(this.prev<c.finallyLoc)return b(c.finallyLoc)}else if(W){if(this.prev<c.catchLoc)return b(c.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return b(c.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc<=this.prev&&m.call(b,"finallyLoc")&&this.prev<b.finallyLoc){var G=b;break}}G&&("break"===l||"continue"===l)&&G.tryLoc<=Z&&Z<=G.finallyLoc&&(G=null);var c=G?G.completion:{};return c.type=l,c.arg=Z,G?(this.method="next",this.next=G.finallyLoc,a):this.complete(c)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),x(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var b=m.arg;x(d)}return b}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":c(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),i=X((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,c){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,G||l,c),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function c(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var b=0,G=m.length,c=new Array(G);b<G;b++)c[b]=m[b].fn;return c},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,b,G,c){var X=d?d+l:l;if(!this._events[X])return!1;var W,u,i=this._events[X],y=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),y){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,G),!0;case 6:return i.fn.call(i.context,Z,m,b,G,c),!0}for(u=1,W=new Array(y-1);u<y;u++)W[u-1]=arguments[u];i.fn.apply(i.context,W)}else{var p,V=i.length;for(u=0;u<V;u++)switch(i[u].once&&this.removeListener(l,i[u].fn,void 0,!0),y){case 1:i[u].fn.call(i[u].context);break;case 2:i[u].fn.call(i[u].context,Z);break;case 3:i[u].fn.call(i[u].context,Z,m);break;case 4:i[u].fn.call(i[u].context,Z,m,b);break;default:if(!W)for(p=1,W=new Array(y-1);p<y;p++)W[p-1]=arguments[p];i[u].fn.apply(i[u].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return c(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||c(this,G);else{for(var W=0,u=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&u.push(X[W]);u.length?this._events[G]=1===u.length?u[0]:u:c(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&c(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new i}function m(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function b(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}var c,X=(c="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCnZhciB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e307ZnVuY3Rpb24gZSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHIoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBuPWUsaT1yO2Z1bmN0aW9uIG8odCl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigobj09PWV8fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIG4odCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgdC5zZXRUaW1lb3V0JiYobj1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jbGVhclRpbWVvdXQmJihpPWNsZWFyVGltZW91dCk7dmFyIGEscz1bXSx1PSExLGY9LTE7ZnVuY3Rpb24gaCgpe3UmJmEmJih1PSExLGEubGVuZ3RoP3M9YS5jb25jYXQocyk6Zj0tMSxzLmxlbmd0aCYmbCgpKX1mdW5jdGlvbiBsKCl7aWYoIXUpe3ZhciB0PW8oaCk7dT0hMDtmb3IodmFyIGU9cy5sZW5ndGg7ZTspe2ZvcihhPXMscz1bXTsrK2Y8ZTspYSYmYVtmXS5ydW4oKTtmPS0xLGU9cy5sZW5ndGh9YT1udWxsLHU9ITEsZnVuY3Rpb24odCl7aWYoaT09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KHQpO2lmKChpPT09cnx8IWkpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGk9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7aSh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGkuY2FsbChudWxsLHQpfWNhdGNoKGUpe3JldHVybiBpLmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gYyh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO3MucHVzaChuZXcgZCh0LGUpKSwxIT09cy5sZW5ndGh8fHV8fG8obCl9ZnVuY3Rpb24gZCh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWQucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIHAoKXt9dmFyIGc9cCx5PXAsYj1wLHY9cCx3PXAsbT1wLF89cDt2YXIgUz10LnBlcmZvcm1hbmNlfHx7fSxFPVMubm93fHxTLm1vek5vd3x8Uy5tc05vd3x8Uy5vTm93fHxTLndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIGs9bmV3IERhdGU7dmFyIFI9e25leHRUaWNrOmMsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpnLGFkZExpc3RlbmVyOnksb25jZTpiLG9mZjp2LHJlbW92ZUxpc3RlbmVyOncscmVtb3ZlQWxsTGlzdGVuZXJzOm0sZW1pdDpfLGJpbmRpbmc6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbih0KXt2YXIgZT0uMDAxKkUuY2FsbChTKSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1rKS8xZTN9fSxqPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gVCh0KXtpZih0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX19KX0pKSxlfWZ1bmN0aW9uIE8odCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9dmFyIEE9TygoZnVuY3Rpb24odCl7dm9pZCAwPT09Unx8IVIudmVyc2lvbnx8MD09PVIudmVyc2lvbi5pbmRleE9mKCJ2MC4iKXx8MD09PVIudmVyc2lvbi5pbmRleE9mKCJ2MS4iKSYmMCE9PVIudmVyc2lvbi5pbmRleE9mKCJ2MS44LiIpP3QuZXhwb3J0cz17bmV4dFRpY2s6ZnVuY3Rpb24odCxlLHIsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignImNhbGxiYWNrIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTt2YXIgaSxvLGE9YXJndW1lbnRzLmxlbmd0aDtzd2l0Y2goYSl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gUi5uZXh0VGljayh0KTtjYXNlIDI6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSl9KSk7Y2FzZSAzOnJldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLGUscil9KSk7Y2FzZSA0OnJldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLGUscixuKX0pKTtkZWZhdWx0OmZvcihpPW5ldyBBcnJheShhLTEpLG89MDtvPGkubGVuZ3RoOylpW28rK109YXJndW1lbnRzW29dO3JldHVybiBSLm5leHRUaWNrKChmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxpKX0pKX19fTp0LmV4cG9ydHM9Un0pKSxDPXt9LnRvU3RyaW5nLE09QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09Qy5jYWxsKHQpfTtmdW5jdGlvbiB4KCl7fWZ1bmN0aW9uIEwoKXtMLmluaXQuY2FsbCh0aGlzKX1mdW5jdGlvbiBCKHQpe3JldHVybiB2b2lkIDA9PT10Ll9tYXhMaXN0ZW5lcnM/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnQuX21heExpc3RlbmVyc31mdW5jdGlvbiBQKHQsZSxyKXtpZihlKXQuY2FsbChyKTtlbHNlIGZvcih2YXIgbj10Lmxlbmd0aCxpPXoodCxuKSxvPTA7bzxuOysrbylpW29dLmNhbGwocil9ZnVuY3Rpb24gVSh0LGUscixuKXtpZihlKXQuY2FsbChyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89eih0LGkpLGE9MDthPGk7KythKW9bYV0uY2FsbChyLG4pfWZ1bmN0aW9uIE4odCxlLHIsbixpKXtpZihlKXQuY2FsbChyLG4saSk7ZWxzZSBmb3IodmFyIG89dC5sZW5ndGgsYT16KHQsbykscz0wO3M8bzsrK3MpYVtzXS5jYWxsKHIsbixpKX1mdW5jdGlvbiBEKHQsZSxyLG4saSxvKXtpZihlKXQuY2FsbChyLG4saSxvKTtlbHNlIGZvcih2YXIgYT10Lmxlbmd0aCxzPXoodCxhKSx1PTA7dTxhOysrdSlzW3VdLmNhbGwocixuLGksbyl9ZnVuY3Rpb24gSSh0LGUscixuKXtpZihlKXQuYXBwbHkocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPXoodCxpKSxhPTA7YTxpOysrYSlvW2FdLmFwcGx5KHIsbil9ZnVuY3Rpb24gcSh0LGUscixuKXt2YXIgaSxvLGEscztpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKChvPXQuX2V2ZW50cyk/KG8ubmV3TGlzdGVuZXImJih0LmVtaXQoIm5ld0xpc3RlbmVyIixlLHIubGlzdGVuZXI/ci5saXN0ZW5lcjpyKSxvPXQuX2V2ZW50cyksYT1vW2VdKToobz10Ll9ldmVudHM9bmV3IHgsdC5fZXZlbnRzQ291bnQ9MCksYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGE/YT1vW2VdPW4/W3IsYV06W2Escl06bj9hLnVuc2hpZnQocik6YS5wdXNoKHIpLCFhLndhcm5lZCYmKGk9Qih0KSkmJmk+MCYmYS5sZW5ndGg+aSl7YS53YXJuZWQ9ITA7dmFyIHU9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK2UrIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7dS5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLHUuZW1pdHRlcj10LHUudHlwZT1lLHUuY291bnQ9YS5sZW5ndGgscz11LCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLndhcm4/Y29uc29sZS53YXJuKHMpOmNvbnNvbGUubG9nKHMpfX1lbHNlIGE9b1tlXT1yLCsrdC5fZXZlbnRzQ291bnQ7cmV0dXJuIHR9ZnVuY3Rpb24gRih0LGUscil7dmFyIG49ITE7ZnVuY3Rpb24gaSgpe3QucmVtb3ZlTGlzdGVuZXIoZSxpKSxufHwobj0hMCxyLmFwcGx5KHQsYXJndW1lbnRzKSl9cmV0dXJuIGkubGlzdGVuZXI9cixpfWZ1bmN0aW9uIFcodCl7dmFyIGU9dGhpcy5fZXZlbnRzO2lmKGUpe3ZhciByPWVbdF07aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIDE7aWYocilyZXR1cm4gci5sZW5ndGh9cmV0dXJuIDB9ZnVuY3Rpb24geih0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9eC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShudWxsKSxMLkV2ZW50RW1pdHRlcj1MLEwudXNpbmdEb21haW5zPSExLEwucHJvdG90eXBlLmRvbWFpbj12b2lkIDAsTC5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsTC5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsTC5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLEwuaW5pdD1mdW5jdGlvbigpe3RoaXMuZG9tYWluPW51bGwsTC51c2luZ0RvbWFpbnMmJnVuZGVmaW5lZC5hY3RpdmUsdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8aXNOYU4odCkpdGhyb3cgbmV3IFR5cGVFcnJvcignIm4iIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXQsdGhpc30sTC5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIEIodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhLHMsdT0iZXJyb3IiPT09dDtpZihhPXRoaXMuX2V2ZW50cyl1PXUmJm51bGw9PWEuZXJyb3I7ZWxzZSBpZighdSlyZXR1cm4hMTtpZihzPXRoaXMuZG9tYWluLHUpe2lmKGU9YXJndW1lbnRzWzFdLCFzKXtpZihlIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgZTt2YXIgZj1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJytlKyIpIik7dGhyb3cgZi5jb250ZXh0PWUsZn1yZXR1cm4gZXx8KGU9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudCcpKSxlLmRvbWFpbkVtaXR0ZXI9dGhpcyxlLmRvbWFpbj1zLGUuZG9tYWluVGhyb3duPSExLHMuZW1pdCgiZXJyb3IiLGUpLCExfWlmKCEocj1hW3RdKSlyZXR1cm4hMTt2YXIgaD0iZnVuY3Rpb24iPT10eXBlb2Ygcjtzd2l0Y2gobj1hcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6UChyLGgsdGhpcyk7YnJlYWs7Y2FzZSAyOlUocixoLHRoaXMsYXJndW1lbnRzWzFdKTticmVhaztjYXNlIDM6TihyLGgsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztjYXNlIDQ6RChyLGgsdGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXSk7YnJlYWs7ZGVmYXVsdDpmb3IoaT1uZXcgQXJyYXkobi0xKSxvPTE7bzxuO28rKylpW28tMV09YXJndW1lbnRzW29dO0kocixoLHRoaXMsaSl9cmV0dXJuITB9LEwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHEodGhpcyx0LGUsITEpfSxMLnByb3RvdHlwZS5vbj1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixMLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcSh0aGlzLHQsZSwhMCl9LEwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLm9uKHQsRih0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiB0aGlzLnByZXBlbmRMaXN0ZW5lcih0LEYodGhpcyx0LGUpKSx0aGlzfSxMLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLGE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZighKG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighKHI9blt0XSkpcmV0dXJuIHRoaXM7aWYocj09PWV8fHIubGlzdGVuZXImJnIubGlzdGVuZXI9PT1lKTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB4OihkZWxldGUgblt0XSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LHIubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXtmb3IoaT0tMSxvPXIubGVuZ3RoO28tLSA+MDspaWYocltvXT09PWV8fHJbb10ubGlzdGVuZXImJnJbb10ubGlzdGVuZXI9PT1lKXthPXJbb10ubGlzdGVuZXIsaT1vO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpZigxPT09ci5sZW5ndGgpe2lmKHJbMF09dm9pZCAwLDA9PS0tdGhpcy5fZXZlbnRzQ291bnQpcmV0dXJuIHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzO2RlbGV0ZSBuW3RdfWVsc2UhZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9ZSxuPXIrMSxpPXQubGVuZ3RoO248aTtyKz0xLG4rPTEpdFtyXT10W25dO3QucG9wKCl9KHIsaSk7bi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxhfHxlKX1yZXR1cm4gdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoIShyPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIXIucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9bmV3IHgsdGhpcy5fZXZlbnRzQ291bnQ9MCk6clt0XSYmKDA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPW5ldyB4OmRlbGV0ZSByW3RdKSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIG4saT1PYmplY3Qua2V5cyhyKSxvPTA7bzxpLmxlbmd0aDsrK28pInJlbW92ZUxpc3RlbmVyIiE9PShuPWlbb10pJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhuKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPW5ldyB4LHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2YoZT1yW3RdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZSk7ZWxzZSBpZihlKWRve3RoaXMucmVtb3ZlTGlzdGVuZXIodCxlW2UubGVuZ3RoLTFdKX13aGlsZShlWzBdKTtyZXR1cm4gdGhpc30sTC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dGhpcy5fZXZlbnRzO3JldHVybiByJiYoZT1yW3RdKT8iZnVuY3Rpb24iPT10eXBlb2YgZT9bZS5saXN0ZW5lcnx8ZV06ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8ZS5sZW5ndGg7KytyKWVbcl09dFtyXS5saXN0ZW5lcnx8dFtyXTtyZXR1cm4gZX0oZSk6W119LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmxpc3RlbmVyQ291bnQ/dC5saXN0ZW5lckNvdW50KGUpOlcuY2FsbCh0LGUpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVcsTC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP1JlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpOltdfTt2YXIgWT1UKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6TCxFdmVudEVtaXR0ZXI6TH0pKSwkPVkuRXZlbnRFbWl0dGVyLEg9W10sSj1bXSxHPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LFY9ITE7ZnVuY3Rpb24gSygpe1Y9ITA7Zm9yKHZhciB0PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixlPTAscj10Lmxlbmd0aDtlPHI7KytlKUhbZV09dFtlXSxKW3QuY2hhckNvZGVBdChlKV09ZTtKWyItIi5jaGFyQ29kZUF0KDApXT02MixKWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBaKHQsZSxyKXtmb3IodmFyIG4saSxvPVtdLGE9ZTthPHI7YSs9MyluPSh0W2FdPDwxNikrKHRbYSsxXTw8OCkrdFthKzJdLG8ucHVzaChIWyhpPW4pPj4xOCY2M10rSFtpPj4xMiY2M10rSFtpPj42JjYzXStIWzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBYKHQpe3ZhciBlO1Z8fEsoKTtmb3IodmFyIHI9dC5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLGE9MTYzODMscz0wLHU9ci1uO3M8dTtzKz1hKW8ucHVzaChaKHQscyxzK2E+dT91OnMrYSkpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9SFtlPj4yXSxpKz1IW2U8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYoZT0odFtyLTJdPDw4KSt0W3ItMV0saSs9SFtlPj4xMF0saSs9SFtlPj40JjYzXSxpKz1IW2U8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gUSh0LGUscixuLGkpe3ZhciBvLGEscz04Kmktbi0xLHU9KDE8PHMpLTEsZj11Pj4xLGg9LTcsbD1yP2ktMTowLGM9cj8tMToxLGQ9dFtlK2xdO2ZvcihsKz1jLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPXM7aD4wO289MjU2Km8rdFtlK2xdLGwrPWMsaC09OCk7Zm9yKGE9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO2E9MjU2KmErdFtlK2xdLGwrPWMsaC09OCk7aWYoMD09PW8pbz0xLWY7ZWxzZXtpZihvPT09dSlyZXR1cm4gYT9OYU46MS8wKihkPy0xOjEpO2ErPU1hdGgucG93KDIsbiksby09Zn1yZXR1cm4oZD8tMToxKSphKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiB0dCh0LGUscixuLGksbyl7dmFyIGEscyx1LGY9OCpvLWktMSxoPSgxPDxmKS0xLGw9aD4+MSxjPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6by0xLHA9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxhPWgpOihhPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtYSkpPDEmJihhLS0sdSo9MiksKGUrPWErbD49MT9jL3U6YypNYXRoLnBvdygyLDEtbCkpKnU+PTImJihhKyssdS89MiksYStsPj1oPyhzPTAsYT1oKTphK2w+PTE/KHM9KGUqdS0xKSpNYXRoLnBvdygyLGkpLGErPWwpOihzPWUqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIsaSksYT0wKSk7aT49ODt0W3IrZF09MjU1JnMsZCs9cCxzLz0yNTYsaS09OCk7Zm9yKGE9YTw8aXxzLGYrPWk7Zj4wO3RbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixmLT04KTt0W3IrZC1wXXw9MTI4Kmd9dmFyIGV0PXt9LnRvU3RyaW5nLHJ0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWV0LmNhbGwodCl9O2F0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0LlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIG50PWl0KCk7ZnVuY3Rpb24gaXQoKXtyZXR1cm4gYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gb3QodCxlKXtpZihpdCgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU6KG51bGw9PT10JiYodD1uZXcgYXQoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gYXQodCxlLHIpe2lmKCEoYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGF0KSlyZXR1cm4gbmV3IGF0KHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGZ0KHRoaXMsdCl9cmV0dXJuIHN0KHRoaXMsdCxlLHIpfWZ1bmN0aW9uIHN0KHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxyLG4pe2lmKGUuYnl0ZUxlbmd0aCxyPDB8fGUuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSxyKTpuZXcgVWludDhBcnJheShlLHIsbik7YXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1lKS5fX3Byb3RvX189YXQucHJvdG90eXBlOnQ9aHQodCxlKTtyZXR1cm4gdH0odCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighYXQuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGR0KGUsciksaT0odD1vdCh0LG4pKS53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihjdChlKSl7dmFyIHI9MHxsdChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1vdCh0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/b3QodCwwKTpodCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZydChlLmRhdGEpKXJldHVybiBodCh0LGUuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfSh0LGUpfWZ1bmN0aW9uIHV0KHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZnQodCxlKXtpZih1dChlKSx0PW90KHQsZTwwPzA6MHxsdChlKSksIWF0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjxlOysrcil0W3JdPTA7cmV0dXJuIHR9ZnVuY3Rpb24gaHQodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxsdChlLmxlbmd0aCk7dD1vdCh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gbHQodCl7aWYodD49aXQoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraXQoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gY3QodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIGR0KHQsZSl7aWYoY3QodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEl0KHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqcjtjYXNlImhleCI6cmV0dXJuIHI+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gcXQodCkubGVuZ3RoO2RlZmF1bHQ6aWYobilyZXR1cm4gSXQodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gcHQodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gT3QodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIFJ0KHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4ganQodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFR0KHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIGt0KHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEF0KHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIGd0KHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24geXQodCxlLHIsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6dC5sZW5ndGgtMSkscjwwJiYocj10Lmxlbmd0aCtyKSxyPj10Lmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPXQubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPWF0LmZyb20oZSxuKSksY3QoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpidCh0LGUscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpidCh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gYnQodCxlLHIsbixpKXt2YXIgbyxhPTEscz10Lmxlbmd0aCx1PWUubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKHQubGVuZ3RoPDJ8fGUubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gMT09PWE/dFtlXTp0LnJlYWRVSW50MTZCRShlKmEpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxzO28rKylpZihmKHQsbyk9PT1mKGUsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqYX1lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5zJiYocj1zLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGM9MDtjPHU7YysrKWlmKGYodCxvK2MpIT09ZihlLGMpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gdnQodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIGE9MDthPG47KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbcithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHd0KHQsZSxyLG4pe3JldHVybiBGdChJdChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBtdCh0LGUscixuKXtyZXR1cm4gRnQoZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcillLnB1c2goMjU1JnQuY2hhckNvZGVBdChyKSk7cmV0dXJuIGV9KGUpLHQscixuKX1mdW5jdGlvbiBfdCh0LGUscixuKXtyZXR1cm4gbXQodCxlLHIsbil9ZnVuY3Rpb24gU3QodCxlLHIsbil7cmV0dXJuIEZ0KHF0KGUpLHQscixuKX1mdW5jdGlvbiBFdCh0LGUscixuKXtyZXR1cm4gRnQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPShyPXQuY2hhckNvZGVBdChhKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBrdCh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/WCh0KTpYKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gUnQodCxlLHIpe3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9ZTtpPHI7KXt2YXIgbyxhLHMsdSxmPXRbaV0saD1udWxsLGw9Zj4yMzk/NDpmPjIyMz8zOmY+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpmPDEyOCYmKGg9Zik7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz10W2krMV0pKSYmKHU9KDMxJmYpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89dFtpKzFdLGE9dFtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmZik8PDEyfCg2MyZvKTw8Nnw2MyZhKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPXRbaSsxXSxhPXRbaSsyXSxzPXRbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmZik8PDE4fCg2MyZvKTw8MTJ8KDYzJmEpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD00MDk2KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgcj0iIixuPTA7Zm9yKDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz00MDk2KSk7cmV0dXJuIHJ9KG4pfWF0LnBvb2xTaXplPTgxOTIsYXQuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPWF0LnByb3RvdHlwZSx0fSxhdC5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gc3QobnVsbCx0LGUscil9LGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJihhdC5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGF0Ll9fcHJvdG9fXz1VaW50OEFycmF5KSxhdC5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB1dChlKSxlPD0wP290KHQsZSk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/b3QodCxlKS5maWxsKHIsbik6b3QodCxlKS5maWxsKHIpOm90KHQsZSl9KG51bGwsdCxlLHIpfSxhdC5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZnQobnVsbCx0KX0sYXQuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBmdChudWxsLHQpfSxhdC5pc0J1ZmZlcj1XdCxhdC5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIWN0KHQpfHwhY3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LGF0LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGF0LmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFydCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBhdC5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT1lKWZvcihlPTAscj0wO3I8dC5sZW5ndGg7KytyKWUrPXRbcl0ubGVuZ3RoO3ZhciBuPWF0LmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFjdChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LGF0LmJ5dGVMZW5ndGg9ZHQsYXQucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxhdC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKWd0KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxhdC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KWd0KHRoaXMsZSxlKzMpLGd0KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpZ3QodGhpcyxlLGUrNyksZ3QodGhpcyxlKzEsZSs2KSxndCh0aGlzLGUrMixlKzUpLGd0KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP1J0KHRoaXMsMCx0KTpwdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGF0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1hdC5jb21wYXJlKHRoaXMsdCl9LGF0LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LGF0LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1yJiYocj10P3QubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fHI+dC5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmZT49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKGU+PXIpcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLGE9KHI+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihvLGEpLHU9dGhpcy5zbGljZShuLGkpLGY9dC5zbGljZShlLHIpLGg9MDtoPHM7KytoKWlmKHVbaF0hPT1mW2hdKXtvPXVbaF0sYT1mW2hdO2JyZWFrfXJldHVybiBvPGE/LTE6YTxvPzE6MH0sYXQucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LGF0LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geXQodGhpcyx0LGUsciwhMCl9LGF0LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHl0KHRoaXMsdCxlLHIsITEpfSxhdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIHZ0KHRoaXMsdCxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHd0KHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBtdCh0aGlzLHQsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBfdCh0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFN0KHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRXQodGhpcyx0LGUscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sYXQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24ganQodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBUdCh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gT3QodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz1EdCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBBdCh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEN0KHQsZSxyKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBNdCh0LGUscixuLGksbyl7aWYoIWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiB4dCh0LGUscixuKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDIpO2k8bzsrK2kpdFtyK2ldPShlJjI1NTw8OCoobj9pOjEtaSkpPj4+OCoobj9pOjEtaSl9ZnVuY3Rpb24gTHQodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gQnQodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBQdCh0LGUscixuLGkpe3JldHVybiBpfHxCdCh0LDAsciw0KSx0dCh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBVdCh0LGUscixuLGkpe3JldHVybiBpfHxCdCh0LDAsciw4KSx0dCh0LGUscixuLDUyLDgpLHIrOH1hdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSwoZT12b2lkIDA9PT1lP246fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLGU8dCYmKGU9dCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT1lLXQ7cj1uZXcgYXQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rdF19cmV0dXJuIHJ9LGF0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG59LGF0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LGF0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh9LGF0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LGF0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW3RdKyh0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM10pfSxhdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxhdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Q3QodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsbz10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW3QrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sYXQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbdF0/LTEqKDI1NS10aGlzW3RdKzEpOnRoaXNbdF19LGF0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fEN0KHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LGF0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbih0LGUpe2V8fEN0KHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LGF0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sYXQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxhdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMCwyMyw0KX0sYXQucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITEsMjMsNCl9LGF0LnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw4LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMCw1Miw4KX0sYXQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDgsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCExLDUyLDgpfSxhdC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxNdCh0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoaSo9MjU2KTspdGhpc1tlK29dPXQvaSYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8TXQodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMSwyNTUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOnh0KHRoaXMsdCxlLCEwKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsNjU1MzUsMCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOnh0KHRoaXMsdCxlLCExKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOkx0KHRoaXMsdCxlLCEwKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkx0KHRoaXMsdCxlLCExKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7TXQodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAsYT0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGEqPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2Urby0xXSYmKHM9MSksdGhpc1tlK29dPSh0L2E+PjApLXMmMjU1O3JldHVybiBlK3J9LGF0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7TXQodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxhPTEscz0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvKzFdJiYocz0xKSx0aGlzW2Urb109KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwxLDEyNywtMTI4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6eHQodGhpcyx0LGUsITApLGUrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOnh0KHRoaXMsdCxlLCExKSxlKzJ9LGF0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOkx0KHRoaXMsdCxlLCEwKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOkx0KHRoaXMsdCxlLCExKSxlKzR9LGF0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBQdCh0aGlzLHQsZSwhMCxyKX0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFB0KHRoaXMsdCxlLCExLHIpfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFV0KHRoaXMsdCxlLCEwLHIpfSxhdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFV0KHRoaXMsdCxlLCExLHIpfSxhdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhYXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LGF0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhuPWUsZT0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBpPXQuY2hhckNvZGVBdCgwKTtpPDI1NiYmKHQ9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFhdC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgYT1jdCh0KT90Okl0KG5ldyBhdCh0LG4pLnRvU3RyaW5nKCkpLHM9YS5sZW5ndGg7Zm9yKG89MDtvPHItZTsrK28pdGhpc1tvK2VdPWFbbyVzXX1yZXR1cm4gdGhpc307dmFyIE50PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIER0KHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBJdCh0LGUpe3ZhciByO2U9ZXx8MS8wO2Zvcih2YXIgbj10Lmxlbmd0aCxpPW51bGwsbz1bXSxhPTA7YTxuOysrYSl7aWYoKHI9dC5jaGFyQ29kZUF0KGEpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1uKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gcXQodCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYTtWfHxLKCk7dmFyIHM9dC5sZW5ndGg7aWYocyU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT10W3MtMl0/MjoiPSI9PT10W3MtMV0/MTowLGE9bmV3IEcoMypzLzQtbyksbj1vPjA/cy00OnM7dmFyIHU9MDtmb3IoZT0wLHI9MDtlPG47ZSs9NCxyKz0zKWk9Slt0LmNoYXJDb2RlQXQoZSldPDwxOHxKW3QuY2hhckNvZGVBdChlKzEpXTw8MTJ8Slt0LmNoYXJDb2RlQXQoZSsyKV08PDZ8Slt0LmNoYXJDb2RlQXQoZSszKV0sYVt1KytdPWk+PjE2JjI1NSxhW3UrK109aT4+OCYyNTUsYVt1KytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1KW3QuY2hhckNvZGVBdChlKV08PDJ8Slt0LmNoYXJDb2RlQXQoZSsxKV0+PjQsYVt1KytdPTI1NSZpKToxPT09byYmKGk9Slt0LmNoYXJDb2RlQXQoZSldPDwxMHxKW3QuY2hhckNvZGVBdChlKzEpXTw8NHxKW3QuY2hhckNvZGVBdChlKzIpXT4+MixhW3UrK109aT4+OCYyNTUsYVt1KytdPTI1NSZpKSxhfShmdW5jdGlvbih0KXtpZigodD1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSh0KS5yZXBsYWNlKE50LCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiBGdCh0LGUscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krcl09dFtpXTtyZXR1cm4gaX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gbnVsbCE9dCYmKCEhdC5faXNCdWZmZXJ8fHp0KHQpfHxmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc2xpY2UmJnp0KHQuc2xpY2UoMCwwKSl9KHQpKX1mdW5jdGlvbiB6dCh0KXtyZXR1cm4hIXQuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZ0LmNvbnN0cnVjdG9yLmlzQnVmZmVyKHQpfXZhciBZdD1UKE9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjphdCxJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKHQpe3JldHVybit0IT10JiYodD0wKSxhdC5hbGxvYygrdCl9LGlzQnVmZmVyOld0LGtNYXhMZW5ndGg6bnR9KSksJHQ9TygoZnVuY3Rpb24odCxlKXt2YXIgcj1ZdC5CdWZmZXI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXX1mdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gcih0LGUsbil9ci5mcm9tJiZyLmFsbG9jJiZyLmFsbG9jVW5zYWZlJiZyLmFsbG9jVW5zYWZlU2xvdz90LmV4cG9ydHM9WXQ6KG4oWXQsZSksZS5CdWZmZXI9aSksbihyLGkpLGkuZnJvbT1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCxlLG4pfSxpLmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIodCk7cmV0dXJuIHZvaWQgMCE9PWU/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbChlLG4pOmkuZmlsbChlKTppLmZpbGwoMCksaX0saS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKHQpfSxpLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBZdC5TbG93QnVmZmVyKHQpfX0pKTtmdW5jdGlvbiBIdCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfXZhciBKdCxHdD17aXNBcnJheTpmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheT9BcnJheS5pc0FycmF5KHQpOiJbb2JqZWN0IEFycmF5XSI9PT1IdCh0KX0saXNCb29sZWFuOmZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9LGlzTnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LGlzTnVsbE9yVW5kZWZpbmVkOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxpc051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9LGlzU3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH0saXNTeW1ib2w6ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fSxpc1VuZGVmaW5lZDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH0saXNSZWdFeHA6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1IdCh0KX0saXNPYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH0saXNEYXRlOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PUh0KHQpfSxpc0Vycm9yOmZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEVycm9yXSI9PT1IdCh0KXx8dCBpbnN0YW5jZW9mIEVycm9yfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fSxpc1ByaW1pdGl2ZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fHwic3ltYm9sIj09dHlwZW9mIHR8fHZvaWQgMD09PXR9LGlzQnVmZmVyOll0LkJ1ZmZlci5pc0J1ZmZlcn0sVnQ9TygoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX19KSk7SnQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciBLdD1KdCxadD0vJVtzZGolXS9nO2Z1bmN0aW9uIFh0KHQpe2lmKCFwZSh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaChuZShhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFp0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLGE9bltyXTtyPGk7YT1uWysrcl0pbGUoYSl8fCF2ZShhKT9vKz0iICIrYTpvKz0iICIrbmUoYSk7cmV0dXJuIG99ZnVuY3Rpb24gUXQoZSxyKXtpZih5ZSh0LnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBRdChlLHIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1SLm5vRGVwcmVjYXRpb24pcmV0dXJuIGU7dmFyIG49ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIW4pe2lmKFIudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3Iocik7Ui50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2Uocik6Y29uc29sZS5lcnJvcihyKSxuPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIHRlLGVlPXt9O2Z1bmN0aW9uIHJlKHQpe2lmKHllKHRlKSYmKHRlPVIuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhZWVbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdCh0ZSkpe2VlW3RdPWZ1bmN0aW9uKCl7dmFyIGU9WHQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIGVlW3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZWVbdF19ZnVuY3Rpb24gbmUodCxlKXt2YXIgcj17c2VlbjpbXSxzdHlsaXplOm9lfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKHIuZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYoci5jb2xvcnM9YXJndW1lbnRzWzNdKSxoZShlKT9yLnNob3dIaWRkZW49ZTplJiZBZShyLGUpLHllKHIuc2hvd0hpZGRlbikmJihyLnNob3dIaWRkZW49ITEpLHllKHIuZGVwdGgpJiYoci5kZXB0aD0yKSx5ZShyLmNvbG9ycykmJihyLmNvbG9ycz0hMSkseWUoci5jdXN0b21JbnNwZWN0KSYmKHIuY3VzdG9tSW5zcGVjdD0hMCksci5jb2xvcnMmJihyLnN0eWxpemU9aWUpLGFlKHIsdCxyLmRlcHRoKX1mdW5jdGlvbiBpZSh0LGUpe3ZhciByPW5lLnN0eWxlc1tlXTtyZXR1cm4gcj8iG1siK25lLmNvbG9yc1tyXVswXSsibSIrdCsiG1siK25lLmNvbG9yc1tyXVsxXSsibSI6dH1mdW5jdGlvbiBvZSh0LGUpe3JldHVybiB0fWZ1bmN0aW9uIGFlKHQsZSxyKXtpZih0LmN1c3RvbUluc3BlY3QmJmUmJl9lKGUuaW5zcGVjdCkmJmUuaW5zcGVjdCE9PW5lJiYoIWUuY29uc3RydWN0b3J8fGUuY29uc3RydWN0b3IucHJvdG90eXBlIT09ZSkpe3ZhciBuPWUuaW5zcGVjdChyLHQpO3JldHVybiBwZShuKXx8KG49YWUodCxuLHIpKSxufXZhciBpPWZ1bmN0aW9uKHQsZSl7aWYoeWUoZSkpcmV0dXJuIHQuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYocGUoZSkpe3ZhciByPSInIitKU09OLnN0cmluZ2lmeShlKS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiB0LnN0eWxpemUociwic3RyaW5nIil9aWYoZGUoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTtpZihoZShlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihsZShlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSksYT1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksbWUoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gc2UoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihfZShlKSl7dmFyIHM9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrcysiXSIsInNwZWNpYWwiKX1pZihiZShlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYod2UoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYobWUoZSkpcmV0dXJuIHNlKGUpfXZhciB1LGY9IiIsaD0hMSxsPVsieyIsIn0iXTsoZmUoZSkmJihoPSEwLGw9WyJbIiwiXSJdKSxfZShlKSkmJihmPSIgW0Z1bmN0aW9uIisoZS5uYW1lPyI6ICIrZS5uYW1lOiIiKSsiXSIpO3JldHVybiBiZShlKSYmKGY9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksd2UoZSkmJihmPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKGUpKSxtZShlKSYmKGY9IiAiK3NlKGUpKSwwIT09by5sZW5ndGh8fGgmJjAhPWUubGVuZ3RoP3I8MD9iZShlKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTp0LnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOih0LnNlZW4ucHVzaChlKSx1PWg/ZnVuY3Rpb24odCxlLHIsbixpKXtmb3IodmFyIG89W10sYT0wLHM9ZS5sZW5ndGg7YTxzOysrYSlDZShlLFN0cmluZyhhKSk/by5wdXNoKHVlKHQsZSxyLG4sU3RyaW5nKGEpLCEwKSk6by5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxvLnB1c2godWUodCxlLHIsbixpLCEwKSl9KSksb30odCxlLHIsYSxvKTpvLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHVlKHQsZSxyLGEsbixoKX0pKSx0LnNlZW4ucG9wKCksZnVuY3Rpb24odCxlLHIpe2lmKHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIlxuIiksdCtlLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0odSxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiBzZSh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIHVlKHQsZSxyLG4saSxvKXt2YXIgYSxzLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9zPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihzPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLENlKG4saSl8fChhPSJbIitpKyJdIiksc3x8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KHM9bGUocik/YWUodCx1LnZhbHVlLG51bGwpOmFlKHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYocz1vP3Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIitzLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTpzPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSkseWUoYSkpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIHM7KGE9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KGE9YS5zdWJzdHIoMSxhLmxlbmd0aC0yKSxhPXQuc3R5bGl6ZShhLCJuYW1lIikpOihhPWEucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLGE9dC5zdHlsaXplKGEsInN0cmluZyIpKX1yZXR1cm4gYSsiOiAiK3N9ZnVuY3Rpb24gZmUodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gaGUodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gY2UodCl7cmV0dXJuIG51bGw9PXR9ZnVuY3Rpb24gZGUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIHBlKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdH1mdW5jdGlvbiBnZSh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9ZnVuY3Rpb24geWUodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gYmUodCl7cmV0dXJuIHZlKHQpJiYiW29iamVjdCBSZWdFeHBdIj09PWtlKHQpfWZ1bmN0aW9uIHZlKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHZlKHQpJiYiW29iamVjdCBEYXRlXSI9PT1rZSh0KX1mdW5jdGlvbiBtZSh0KXtyZXR1cm4gdmUodCkmJigiW29iamVjdCBFcnJvcl0iPT09a2UodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gX2UodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gU2UodCl7cmV0dXJuIG51bGw9PT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0fHwibnVtYmVyIj09dHlwZW9mIHR8fCJzdHJpbmciPT10eXBlb2YgdHx8InN5bWJvbCI9PXR5cGVvZiB0fHx2b2lkIDA9PT10fWZ1bmN0aW9uIEVlKHQpe3JldHVybiBhdC5pc0J1ZmZlcih0KX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFJlKHQpe3JldHVybiB0PDEwPyIwIit0LnRvU3RyaW5nKDEwKTp0LnRvU3RyaW5nKDEwKX1uZS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LG5lLnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9O3ZhciBqZT1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO2Z1bmN0aW9uIFRlKCl7dmFyIHQ9bmV3IERhdGUsZT1bUmUodC5nZXRIb3VycygpKSxSZSh0LmdldE1pbnV0ZXMoKSksUmUodC5nZXRTZWNvbmRzKCkpXS5qb2luKCI6Iik7cmV0dXJuW3QuZ2V0RGF0ZSgpLGplW3QuZ2V0TW9udGgoKV0sZV0uam9pbigiICIpfWZ1bmN0aW9uIE9lKCl7Y29uc29sZS5sb2coIiVzIC0gJXMiLFRlKCksWHQuYXBwbHkobnVsbCxhcmd1bWVudHMpKX1mdW5jdGlvbiBBZSh0LGUpe2lmKCFlfHwhdmUoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9ZnVuY3Rpb24gQ2UodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9dmFyIE1lPXtpbmhlcml0czpLdCxfZXh0ZW5kOkFlLGxvZzpPZSxpc0J1ZmZlcjpFZSxpc1ByaW1pdGl2ZTpTZSxpc0Z1bmN0aW9uOl9lLGlzRXJyb3I6bWUsaXNEYXRlOndlLGlzT2JqZWN0OnZlLGlzUmVnRXhwOmJlLGlzVW5kZWZpbmVkOnllLGlzU3ltYm9sOmdlLGlzU3RyaW5nOnBlLGlzTnVtYmVyOmRlLGlzTnVsbE9yVW5kZWZpbmVkOmNlLGlzTnVsbDpsZSxpc0Jvb2xlYW46aGUsaXNBcnJheTpmZSxpbnNwZWN0Om5lLGRlcHJlY2F0ZTpRdCxmb3JtYXQ6WHQsZGVidWdsb2c6cmV9LHhlPVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZm9ybWF0Olh0LGRlcHJlY2F0ZTpRdCxkZWJ1Z2xvZzpyZSxpbnNwZWN0Om5lLGlzQXJyYXk6ZmUsaXNCb29sZWFuOmhlLGlzTnVsbDpsZSxpc051bGxPclVuZGVmaW5lZDpjZSxpc051bWJlcjpkZSxpc1N0cmluZzpwZSxpc1N5bWJvbDpnZSxpc1VuZGVmaW5lZDp5ZSxpc1JlZ0V4cDpiZSxpc09iamVjdDp2ZSxpc0RhdGU6d2UsaXNFcnJvcjptZSxpc0Z1bmN0aW9uOl9lLGlzUHJpbWl0aXZlOlNlLGlzQnVmZmVyOkVlLGxvZzpPZSxpbmhlcml0czpLdCxfZXh0ZW5kOkFlLGRlZmF1bHQ6TWV9KSksTGU9TygoZnVuY3Rpb24odCl7dmFyIGU9JHQuQnVmZmVyO3QuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXJldHVybiB0LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sdC5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sdC5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiAxPT09dGhpcy5sZW5ndGg/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSx0LnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sdC5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gZS5hbGxvYygwKTtpZigxPT09dGhpcy5sZW5ndGgpcmV0dXJuIHRoaXMuaGVhZC5kYXRhO2Zvcih2YXIgcixuLGksbz1lLmFsbG9jVW5zYWZlKHQ+Pj4wKSxhPXRoaXMuaGVhZCxzPTA7YTspcj1hLmRhdGEsbj1vLGk9cyxyLmNvcHkobixpKSxzKz1hLmRhdGEubGVuZ3RoLGE9YS5uZXh0O3JldHVybiBvfSx0fSgpLHhlJiZ4ZS5pbnNwZWN0JiZ4ZS5pbnNwZWN0LmN1c3RvbSYmKHQuZXhwb3J0cy5wcm90b3R5cGVbeGUuaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIHQ9eGUuaW5zcGVjdCh7bGVuZ3RoOnRoaXMubGVuZ3RofSk7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSsiICIrdH0pfSkpO2Z1bmN0aW9uIEJlKHQsZSl7dC5lbWl0KCJlcnJvciIsZSl9dmFyIFBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLGk9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG58fGk/KGU/ZSh0KTohdHx8dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fEEubmV4dFRpY2soQmUsdGhpcyx0KSx0aGlzKToodGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX2Rlc3Ryb3kodHx8bnVsbCwoZnVuY3Rpb24odCl7IWUmJnQ/KEEubmV4dFRpY2soQmUscix0KSxyLl93cml0YWJsZVN0YXRlJiYoci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITApKTplJiZlKHQpfSkpLHRoaXMpfSxVZT1mdW5jdGlvbigpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfSxOZT1mdW5jdGlvbih0LGUpe2lmKERlKCJub0RlcHJlY2F0aW9uIikpcmV0dXJuIHQ7dmFyIHI9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXIpe2lmKERlKCJ0aHJvd0RlcHJlY2F0aW9uIikpdGhyb3cgbmV3IEVycm9yKGUpO0RlKCJ0cmFjZURlcHJlY2F0aW9uIik/Y29uc29sZS50cmFjZShlKTpjb25zb2xlLndhcm4oZSkscj0hMH1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTtmdW5jdGlvbiBEZSh0KXt0cnl7aWYoIWoubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXZhciBlPWoubG9jYWxTdG9yYWdlW3RdO3JldHVybiBudWxsIT1lJiYidHJ1ZSI9PT1TdHJpbmcoZSkudG9Mb3dlckNhc2UoKX12YXIgSWU9YXIscWU9WmU7ZnVuY3Rpb24gRmUodCl7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuZW50cnk7dC5lbnRyeT1udWxsO2Zvcig7bjspe3ZhciBpPW4uY2FsbGJhY2s7ZS5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fWUuY29ya2VkUmVxdWVzdHNGcmVlP2UuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9dDplLmNvcmtlZFJlcXVlc3RzRnJlZT10fShlLHQpfX12YXIgV2UsemU9IVIuYnJvd3NlciYmWyJ2MC4xMCIsInYwLjkuIl0uaW5kZXhPZihSLnZlcnNpb24uc2xpY2UoMCw1KSk+LTE/c2V0SW1tZWRpYXRlOkEubmV4dFRpY2s7WmUuV3JpdGFibGVTdGF0ZT1LZTt2YXIgWWU9T2JqZWN0LmNyZWF0ZShHdCk7WWUuaW5oZXJpdHM9VnQ7dmFyICRlLEhlPXtkZXByZWNhdGU6TmV9LEplPSR0LkJ1ZmZlcixHZT1qLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBWZSgpe31mdW5jdGlvbiBLZSh0LGUpe3Q9dHx8e307dmFyIHI9ZSBpbnN0YW5jZW9mKFdlPVdlfHxJZSk7dGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLHImJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgbj10LmhpZ2hXYXRlck1hcmssaT10LndyaXRhYmxlSGlnaFdhdGVyTWFyayxvPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9bnx8MD09PW4/bjpyJiYoaXx8MD09PWkpP2k6byx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBhPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0hYSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj8oQS5uZXh0VGljayhpLG4pLEEubmV4dFRpY2sobnIsdCxlKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKSk6KGkobiksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbiksbnIodCxlKSl9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1lcihyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fHRyKHQsciksbj96ZShRZSx0LHIsbyxpKTpRZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IEZlKHRoaXMpfWZ1bmN0aW9uIFplKHQpe2lmKFdlPVdlfHxJZSwhKCRlLmNhbGwoWmUsdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBXZSkpcmV0dXJuIG5ldyBaZSh0KTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBLZSh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZpbmFsJiYodGhpcy5fZmluYWw9dC5maW5hbCkpLCQuY2FsbCh0aGlzKX1mdW5jdGlvbiBYZSh0LGUscixuLGksbyxhKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPWEsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIFFlKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksbnIodCxlKX1mdW5jdGlvbiB0cih0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIGE9MCxzPSEwO3I7KWlbYV09cixyLmlzQnVmfHwocz0hMSkscj1yLm5leHQsYSs9MTtpLmFsbEJ1ZmZlcnM9cyxYZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IEZlKGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7cjspe3ZhciB1PXIuY2h1bmssZj1yLmVuY29kaW5nLGg9ci5jYWxsYmFjaztpZihYZSh0LGUsITEsZS5vYmplY3RNb2RlPzE6dS5sZW5ndGgsdSxmLGgpLHI9ci5uZXh0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxlLndyaXRpbmcpYnJlYWt9bnVsbD09PXImJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gZXIodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gcnIodCxlKXt0Ll9maW5hbCgoZnVuY3Rpb24ocil7ZS5wZW5kaW5nY2ItLSxyJiZ0LmVtaXQoImVycm9yIixyKSxlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIiksbnIodCxlKX0pKX1mdW5jdGlvbiBucih0LGUpe3ZhciByPWVyKGUpO3JldHVybiByJiYoIWZ1bmN0aW9uKHQsZSl7ZS5wcmVmaW5pc2hlZHx8ZS5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiI9PXR5cGVvZiB0Ll9maW5hbD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLEEubmV4dFRpY2socnIsdCxlKSk6KGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSkpfSh0LGUpLDA9PT1lLnBlbmRpbmdjYiYmKGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSkpLHJ9WWUuaW5oZXJpdHMoWmUsJCksS2UucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxlPVtdO3Q7KWUucHVzaCh0KSx0PXQubmV4dDtyZXR1cm4gZX0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEtlLnByb3RvdHlwZSwiYnVmZmVyIix7Z2V0OkhlLmRlcHJlY2F0ZSgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsIkRFUDAwMDMiKX0pfWNhdGNoKHQpe319KCksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmhhc0luc3RhbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0/KCRlPUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShaZSxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEhJGUuY2FsbCh0aGlzLHQpfHx0aGlzPT09WmUmJih0JiZ0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgS2UpfX0pKTokZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXN9LFplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxaZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxvPSFuLm9iamVjdE1vZGUmJmZ1bmN0aW9uKHQpe3JldHVybiBKZS5pc0J1ZmZlcih0KXx8dCBpbnN0YW5jZW9mIEdlfSh0KTtyZXR1cm4gbyYmIUplLmlzQnVmZmVyKHQpJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gSmUuZnJvbSh0KX0odCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbz9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9VmUpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLEEubmV4dFRpY2soZSxyKX0odGhpcyxyKToob3x8ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9ITAsbz0hMTtyZXR1cm4gbnVsbD09PXI/bz1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOiJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSxBLm5leHRUaWNrKG4sbyksaT0hMSksaX0odGhpcyxuLHQscikpJiYobi5wZW5kaW5nY2IrKyxpPWZ1bmN0aW9uKHQsZSxyLG4saSxvKXtpZighcil7dmFyIGE9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9SmUuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxuLGkpO24hPT1hJiYocj0hMCxpPSJidWZmZXIiLG49YSl9dmFyIHM9ZS5vYmplY3RNb2RlPzE6bi5sZW5ndGg7ZS5sZW5ndGgrPXM7dmFyIHU9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO3V8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIGY9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bms6bixlbmNvZGluZzppLGlzQnVmOnIsY2FsbGJhY2s6byxuZXh0Om51bGx9LGY/Zi5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIFhlKHQsZSwhMSxzLG4saSxvKTtyZXR1cm4gdX0odGhpcyxuLG8sdCxlLHIpKSxpfSxaZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFplLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8dHIodGhpcyx0KSl9LFplLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShaZS5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxaZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigiX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxaZS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFplLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxucih0LGUpLHImJihlLmZpbmlzaGVkP0EubmV4dFRpY2socik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFplLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLFplLnByb3RvdHlwZS5kZXN0cm95PVBlLFplLnByb3RvdHlwZS5fdW5kZXN0cm95PVVlLFplLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMuZW5kKCksZSh0KX07dmFyIGlyPU9yLG9yPU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdCllLnB1c2gocik7cmV0dXJuIGV9LGFyPWxyLHNyPU9iamVjdC5jcmVhdGUoR3QpO3NyLmluaGVyaXRzPVZ0LHNyLmluaGVyaXRzKGxyLGlyKTtmb3IodmFyIHVyPW9yKHFlLnByb3RvdHlwZSksZnI9MDtmcjx1ci5sZW5ndGg7ZnIrKyl7dmFyIGhyPXVyW2ZyXTtsci5wcm90b3R5cGVbaHJdfHwobHIucHJvdG90eXBlW2hyXT1xZS5wcm90b3R5cGVbaHJdKX1mdW5jdGlvbiBscih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBscikpcmV0dXJuIG5ldyBscih0KTtpci5jYWxsKHRoaXMsdCkscWUuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLGNyKX1mdW5jdGlvbiBjcigpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8QS5uZXh0VGljayhkcix0aGlzKX1mdW5jdGlvbiBkcih0KXt0LmVuZCgpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShsci5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobHIucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbih0KXt2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxsci5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksdGhpcy5lbmQoKSxBLm5leHRUaWNrKGUsdCl9O3ZhciBwcj0kdC5CdWZmZXIsZ3I9cHIuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKCh0PSIiK3QpJiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07dmFyIHlyPWJyO2Z1bmN0aW9uIGJyKHQpe3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiJ1dGY4Ijtmb3IodmFyIGU7Oylzd2l0Y2godCl7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4idXRmOCI7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiJ1dGYxNmxlIjtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiJsYXRpbjEiO2Nhc2UiYmFzZTY0IjpjYXNlImFzY2lpIjpjYXNlImhleCI6cmV0dXJuIHQ7ZGVmYXVsdDppZihlKXJldHVybjt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLGU9ITB9fSh0KTtpZigic3RyaW5nIiE9dHlwZW9mIGUmJihwci5pc0VuY29kaW5nPT09Z3J8fCFncih0KSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiBlfHx0fSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjE2bGUiOnRoaXMudGV4dD1tcix0aGlzLmVuZD1fcixlPTQ7YnJlYWs7Y2FzZSJ1dGY4Ijp0aGlzLmZpbGxMYXN0PXdyLGU9NDticmVhaztjYXNlImJhc2U2NCI6dGhpcy50ZXh0PVNyLHRoaXMuZW5kPUVyLGU9MzticmVhaztkZWZhdWx0OnJldHVybiB0aGlzLndyaXRlPWtyLHZvaWQodGhpcy5lbmQ9UnIpfXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9cHIuYWxsb2NVbnNhZmUoZSl9ZnVuY3Rpb24gdnIodCl7cmV0dXJuIHQ8PTEyNz8wOnQ+PjU9PTY/Mjp0Pj40PT0xND8zOnQ+PjM9PTMwPzQ6dD4+Nj09Mj8tMTotMn1mdW5jdGlvbiB3cih0KXt2YXIgZT10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLHI9ZnVuY3Rpb24odCxlLHIpe2lmKDEyOCE9KDE5MiZlWzBdKSlyZXR1cm4gdC5sYXN0TmVlZD0wLCLvv70iO2lmKHQubGFzdE5lZWQ+MSYmZS5sZW5ndGg+MSl7aWYoMTI4IT0oMTkyJmVbMV0pKXJldHVybiB0Lmxhc3ROZWVkPTEsIu+/vSI7aWYodC5sYXN0TmVlZD4yJiZlLmxlbmd0aD4yJiYxMjghPSgxOTImZVsyXSkpcmV0dXJuIHQubGFzdE5lZWQ9Miwi77+9In19KHRoaXMsdCk7cmV0dXJuIHZvaWQgMCE9PXI/cjp0aGlzLmxhc3ROZWVkPD10Lmxlbmd0aD8odC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKSk6KHQuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0Lmxlbmd0aCksdm9pZCh0aGlzLmxhc3ROZWVkLT10Lmxlbmd0aCkpfWZ1bmN0aW9uIG1yKHQsZSl7aWYoKHQubGVuZ3RoLWUpJTI9PTApe3ZhciByPXQudG9TdHJpbmcoInV0ZjE2bGUiLGUpO2lmKHIpe3ZhciBuPXIuY2hhckNvZGVBdChyLmxlbmd0aC0xKTtpZihuPj01NTI5NiYmbjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXRbdC5sZW5ndGgtMV0sci5zbGljZSgwLC0xKX1yZXR1cm4gcn1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTFdLHQudG9TdHJpbmcoInV0ZjE2bGUiLGUsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gX3IodCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtpZih0aGlzLmxhc3ROZWVkKXt2YXIgcj10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkO3JldHVybiBlK3RoaXMubGFzdENoYXIudG9TdHJpbmcoInV0ZjE2bGUiLDAscil9cmV0dXJuIGV9ZnVuY3Rpb24gU3IodCxlKXt2YXIgcj0odC5sZW5ndGgtZSklMztyZXR1cm4gMD09PXI/dC50b1N0cmluZygiYmFzZTY0IixlKToodGhpcy5sYXN0TmVlZD0zLXIsdGhpcy5sYXN0VG90YWw9MywxPT09cj90aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXRbdC5sZW5ndGgtMV0pLHQudG9TdHJpbmcoImJhc2U2NCIsZSx0Lmxlbmd0aC1yKSl9ZnVuY3Rpb24gRXIodCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoImJhc2U2NCIsMCwzLXRoaXMubGFzdE5lZWQpOmV9ZnVuY3Rpb24ga3IodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gUnIodCl7cmV0dXJuIHQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiJ9YnIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4iIjt2YXIgZSxyO2lmKHRoaXMubGFzdE5lZWQpe2lmKHZvaWQgMD09PShlPXRoaXMuZmlsbExhc3QodCkpKXJldHVybiIiO3I9dGhpcy5sYXN0TmVlZCx0aGlzLmxhc3ROZWVkPTB9ZWxzZSByPTA7cmV0dXJuIHI8dC5sZW5ndGg/ZT9lK3RoaXMudGV4dCh0LHIpOnRoaXMudGV4dCh0LHIpOmV8fCIifSxici5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQubGVuZ3RoP3RoaXMud3JpdGUodCk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZSsi77+9IjplfSxici5wcm90b3R5cGUudGV4dD1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lLmxlbmd0aC0xO2lmKG48cilyZXR1cm4gMDt2YXIgaT12cihlW25dKTtpZihpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMSksaTtpZigtLW48cnx8LTI9PT1pKXJldHVybiAwO2lmKChpPXZyKGVbbl0pKT49MClyZXR1cm4gaT4wJiYodC5sYXN0TmVlZD1pLTIpLGk7aWYoLS1uPHJ8fC0yPT09aSlyZXR1cm4gMDtpZigoaT12cihlW25dKSk+PTApcmV0dXJuIGk+MCYmKDI9PT1pP2k9MDp0Lmxhc3ROZWVkPWktMyksaTtyZXR1cm4gMH0odGhpcyx0LGUpO2lmKCF0aGlzLmxhc3ROZWVkKXJldHVybiB0LnRvU3RyaW5nKCJ1dGY4IixlKTt0aGlzLmxhc3RUb3RhbD1yO3ZhciBuPXQubGVuZ3RoLShyLXRoaXMubGFzdE5lZWQpO3JldHVybiB0LmNvcHkodGhpcy5sYXN0Q2hhciwwLG4pLHQudG9TdHJpbmcoInV0ZjgiLGUsbil9LGJyLnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbih0KXtpZih0aGlzLmxhc3ROZWVkPD10Lmxlbmd0aClyZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTt0LmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdC5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXQubGVuZ3RofTt2YXIganIsVHI9e1N0cmluZ0RlY29kZXI6eXJ9LE9yPU5yO05yLlJlYWRhYmxlU3RhdGU9VXIsWS5FdmVudEVtaXR0ZXI7dmFyIEFyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGlzdGVuZXJzKGUpLmxlbmd0aH0sQ3I9JHQuQnVmZmVyLE1yPWouVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciB4cj1PYmplY3QuY3JlYXRlKEd0KTt4ci5pbmhlcml0cz1WdDt2YXIgTHIsQnI9dm9pZCAwO0JyPXhlJiZ4ZS5kZWJ1Z2xvZz94ZS5kZWJ1Z2xvZygic3RyZWFtIik6ZnVuY3Rpb24oKXt9LHhyLmluaGVyaXRzKE5yLCQpO3ZhciBQcj1bImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXTtmdW5jdGlvbiBVcih0LGUpe3Q9dHx8e307dmFyIHI9ZSBpbnN0YW5jZW9mKGpyPWpyfHxJZSk7dGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLHImJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQucmVhZGFibGVPYmplY3RNb2RlKTt2YXIgbj10LmhpZ2hXYXRlck1hcmssaT10LnJlYWRhYmxlSGlnaFdhdGVyTWFyayxvPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9bnx8MD09PW4/bjpyJiYoaXx8MD09PWkpP2k6byx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuYnVmZmVyPW5ldyBMZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYoTHJ8fChMcj1Uci5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IExyKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24gTnIodCl7aWYoanI9anJ8fEllLCEodGhpcyBpbnN0YW5jZW9mIE5yKSlyZXR1cm4gbmV3IE5yKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IFVyKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpKSwkLmNhbGwodGhpcyl9ZnVuY3Rpb24gRHIodCxlLHIsbixpKXt2YXIgbyxhPXQuX3JlYWRhYmxlU3RhdGU7bnVsbD09PWU/KGEucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAsRnIodCl9KHQsYSkpOihpfHwobz1mdW5jdGlvbih0LGUpe3ZhciByOyhmdW5jdGlvbih0KXtyZXR1cm4gQ3IuaXNCdWZmZXIodCl8fHQgaW5zdGFuY2VvZiBNcn0pKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fHZvaWQgMD09PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oYSxlKSksbz90LmVtaXQoImVycm9yIixvKTphLm9iamVjdE1vZGV8fGUmJmUubGVuZ3RoPjA/KCJzdHJpbmciPT10eXBlb2YgZXx8YS5vYmplY3RNb2RlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1Dci5wcm90b3R5cGV8fChlPWZ1bmN0aW9uKHQpe3JldHVybiBDci5mcm9tKHQpfShlKSksbj9hLmVuZEVtaXR0ZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTpJcih0LGEsZSwhMCk6YS5lbmRlZD90LmVtaXQoImVycm9yIixuZXcgRXJyb3IoInN0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GIikpOihhLnJlYWRpbmc9ITEsYS5kZWNvZGVyJiYhcj8oZT1hLmRlY29kZXIud3JpdGUoZSksYS5vYmplY3RNb2RlfHwwIT09ZS5sZW5ndGg/SXIodCxhLGUsITEpOnpyKHQsYSkpOklyKHQsYSxlLCExKSkpOm58fChhLnJlYWRpbmc9ITEpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShhKX1mdW5jdGlvbiBJcih0LGUscixuKXtlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsbj9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJkZyKHQpKSx6cih0LGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShOci5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxOci5wcm90b3R5cGUuZGVzdHJveT1QZSxOci5wcm90b3R5cGUuX3VuZGVzdHJveT1VZSxOci5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt0aGlzLnB1c2gobnVsbCksZSh0KX0sTnIucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIG4ub2JqZWN0TW9kZT9yPSEwOiJzdHJpbmciPT10eXBlb2YgdCYmKChlPWV8fG4uZGVmYXVsdEVuY29kaW5nKSE9PW4uZW5jb2RpbmcmJih0PUNyLmZyb20odCxlKSxlPSIiKSxyPSEwKSxEcih0aGlzLHQsZSwhMSxyKX0sTnIucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIERyKHRoaXMsdCxudWxsLCEwLCExKX0sTnIucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LE5yLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gTHJ8fChMcj1Uci5TdHJpbmdEZWNvZGVyKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IExyKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBxcih0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIEZyKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChCcigiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9BLm5leHRUaWNrKFdyLHQpOldyKHQpKX1mdW5jdGlvbiBXcih0KXtCcigiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSxKcih0KX1mdW5jdGlvbiB6cih0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLEEubmV4dFRpY2soWXIsdCxlKSl9ZnVuY3Rpb24gWXIodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKEJyKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gJHIodCl7QnIoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiBIcih0LGUpe2UucmVhZGluZ3x8KEJyKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLEpyKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIEpyKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKEJyKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIEdyKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoYT09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKGEpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1Dci5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxhKSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gVnIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxBLm5leHRUaWNrKEtyLGUsdCkpfWZ1bmN0aW9uIEtyKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBacih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1Oci5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtCcigicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gQnIoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP1ZyKHRoaXMpOkZyKHRoaXMpLG51bGw7aWYoMD09PSh0PXFyKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJlZyKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gQnIoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmQnIoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/QnIoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihCcigiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1xcihyLGUpKSksbnVsbD09PShuPXQ+MD9Hcih0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJlZyKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxOci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpKX0sTnIucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxCcigicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9KCFlfHwhMSE9PWUuZW5kKSYmdCE9PVIuc3Rkb3V0JiZ0IT09Ui5zdGRlcnI/YTpwO2Z1bmN0aW9uIG8oZSxpKXtCcigib251bnBpcGUiKSxlPT09ciYmaSYmITE9PT1pLmhhc1VucGlwZWQmJihpLmhhc1VucGlwZWQ9ITAsQnIoImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsYyksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIscyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGwpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHApLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGgpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxzKCkpfWZ1bmN0aW9uIGEoKXtCcigib25lbmQiKSx0LmVuZCgpfW4uZW5kRW1pdHRlZD9BLm5leHRUaWNrKGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7QnIoInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmQXIodCwiZGF0YSIpJiYoZS5mbG93aW5nPSEwLEpyKHQpKX19KHIpO3Qub24oImRyYWluIixzKTt2YXIgdT0hMTt2YXIgZj0hMTtmdW5jdGlvbiBoKGUpe0JyKCJvbmRhdGEiKSxmPSExLCExIT09dC53cml0ZShlKXx8Znx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09WnIobi5waXBlcyx0KSkmJiF1JiYoQnIoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxmPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGwoZSl7QnIoIm9uZXJyb3IiLGUpLHAoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksMD09PUFyKHQsImVycm9yIikmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIGMoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHAoKX1mdW5jdGlvbiBkKCl7QnIoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGMpLHAoKX1mdW5jdGlvbiBwKCl7QnIoInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixoKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP00odC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixsKSx0Lm9uY2UoImNsb3NlIixjKSx0Lm9uY2UoImZpbmlzaCIsZCksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChCcigicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSxOci5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj17aGFzVW5waXBlZDohMX07aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMscikpLHRoaXM7aWYoIXQpe3ZhciBuPWUucGlwZXMsaT1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIG89MDtvPGk7bysrKW5bb10uZW1pdCgidW5waXBlIix0aGlzLHIpO3JldHVybiB0aGlzfXZhciBhPVpyKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1hfHwoZS5waXBlcy5zcGxpY2UoYSwxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMscikpLHRoaXN9LE5yLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPSQucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIG49dGhpcy5fcmVhZGFibGVTdGF0ZTtuLmVuZEVtaXR0ZWR8fG4ucmVhZGFibGVMaXN0ZW5pbmd8fChuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZW1pdHRlZFJlYWRhYmxlPSExLG4ucmVhZGluZz9uLmxlbmd0aCYmRnIodGhpcyk6QS5uZXh0VGljaygkcix0aGlzKSl9cmV0dXJuIHJ9LE5yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1Oci5wcm90b3R5cGUub24sTnIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KEJyKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLEEubmV4dFRpY2soSHIsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LE5yLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBCcigiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoQnIoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sTnIucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXRoaXMuX3JlYWRhYmxlU3RhdGUsbj0hMTtmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihCcigid3JhcHBlZCBlbmQiKSxyLmRlY29kZXImJiFyLmVuZGVkKXt2YXIgdD1yLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJmUucHVzaCh0KX1lLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhCcigid3JhcHBlZCBkYXRhIiksci5kZWNvZGVyJiYoaT1yLmRlY29kZXIud3JpdGUoaSkpLHIub2JqZWN0TW9kZSYmbnVsbD09aSl8fChyLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKGUucHVzaChpKXx8KG49ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO2Zvcih2YXIgbz0wO288UHIubGVuZ3RoO28rKyl0Lm9uKFByW29dLHRoaXMuZW1pdC5iaW5kKHRoaXMsUHJbb10pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihlKXtCcigid3JhcHBlZCBfcmVhZCIsZSksbiYmKG49ITEsdC5yZXN1bWUoKSl9LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOci5wcm90b3R5cGUsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxOci5fZnJvbUxpc3Q9R3I7dmFyIFhyPWVuLFFyPU9iamVjdC5jcmVhdGUoR3QpO2Z1bmN0aW9uIHRuKHQsZSl7dmFyIHI9dGhpcy5fdHJhbnNmb3JtU3RhdGU7ci50cmFuc2Zvcm1pbmc9ITE7dmFyIG49ci53cml0ZWNiO2lmKCFuKXJldHVybiB0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIndyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpKTtyLndyaXRlY2h1bms9bnVsbCxyLndyaXRlY2I9bnVsbCxudWxsIT1lJiZ0aGlzLnB1c2goZSksbih0KTt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kucmVhZGluZz0hMSwoaS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBlbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBlbikpcmV0dXJuIG5ldyBlbih0KTtJZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOnRuLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uKCJwcmVmaW5pc2giLHJuKX1mdW5jdGlvbiBybigpe3ZhciB0PXRoaXM7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbihlLHIpe25uKHQsZSxyKX0pKTpubih0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gbm4odCxlLHIpe2lmKGUpcmV0dXJuIHQuZW1pdCgiZXJyb3IiLGUpO2lmKG51bGwhPXImJnQucHVzaChyKSx0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCIpO2lmKHQuX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfVFyLmluaGVyaXRzPVZ0LFFyLmluaGVyaXRzKGVuLEllKSxlbi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLEllLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyx0LGUpfSxlbi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUscil7dGhyb3cgbmV3IEVycm9yKCJfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkIil9LGVuLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sZW4ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxlbi5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO0llLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsdCwoZnVuY3Rpb24odCl7ZSh0KSxyLmVtaXQoImNsb3NlIil9KSl9O3ZhciBvbj1zbixhbj1PYmplY3QuY3JlYXRlKEd0KTtmdW5jdGlvbiBzbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBzbikpcmV0dXJuIG5ldyBzbih0KTtYci5jYWxsKHRoaXMsdCl9YW4uaW5oZXJpdHM9VnQsYW4uaW5oZXJpdHMoc24sWHIpLHNuLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9O3ZhciB1bj1PKChmdW5jdGlvbih0LGUpeyhlPXQuZXhwb3J0cz1pcikuU3RyZWFtPWUsZS5SZWFkYWJsZT1lLGUuV3JpdGFibGU9cWUsZS5EdXBsZXg9SWUsZS5UcmFuc2Zvcm09WHIsZS5QYXNzVGhyb3VnaD1vbn0pKS5SZWFkYWJsZSxmbj1sbjtsbi5jdG9yPWNuLGxuLm9iaj1mdW5jdGlvbih0LGUpeygiZnVuY3Rpb24iPT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7cmV0dXJuKHQ9cG4odCkpLm9iamVjdE1vZGU9ITAsdC5oaWdoV2F0ZXJNYXJrPTE2LGxuKHQsZSl9O3ZhciBobj1jbigpO2Z1bmN0aW9uIGxuKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7dmFyIHIsbj1uZXcgaG4odCk7cmV0dXJuIG4uX2Zyb209QXJyYXkuaXNBcnJheShlKT8ocj0ocj1lKS5zbGljZSgpLGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbCxpPXIubGVuZ3RoP3Iuc2hpZnQoKTpudWxsO2kgaW5zdGFuY2VvZiBFcnJvciYmKG49aSxpPW51bGwpLGUobixpKX0pOmV8fGRuLG59ZnVuY3Rpb24gY24odCxlKXtmdW5jdGlvbiByKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXJldHVybiBuZXcgcihlKTt0aGlzLl9yZWFkaW5nPSExLHRoaXMuX2NhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7aWYobi5kZXN0cm95ZWQpcmV0dXJuO2lmKHQpcmV0dXJuIG4uZGVzdHJveSh0KTtpZihudWxsPT09ZSlyZXR1cm4gbi5wdXNoKG51bGwpO24uX3JlYWRpbmc9ITEsbi5wdXNoKGUpJiZuLl9yZWFkKGkpfSx0aGlzLmRlc3Ryb3llZD0hMSx1bi5jYWxsKHRoaXMsZXx8dCk7dmFyIG49dGhpcyxpPXRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya31yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKGU9dCx0PXt9KSx0PXBuKHQpLFZ0KHIsdW4pLHIucHJvdG90eXBlLl9mcm9tPWV8fGRuLHIucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRpbmd8fHRoaXMuZGVzdHJveWVkfHwodGhpcy5fcmVhZGluZz0hMCx0aGlzLl9mcm9tKHQsdGhpcy5fY2FsbGJhY2spKX0sci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbih0KXtpZighdGhpcy5kZXN0cm95ZWQpe3RoaXMuZGVzdHJveWVkPSEwO3ZhciBlPXRoaXM7Ui5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9fSxyfWZ1bmN0aW9uIGRuKCl7fWZ1bmN0aW9uIHBuKHQpe3JldHVybiB0PXR8fHt9fXZhciBnbix5bj0xLGJuPXt9LHZuPSExLHduPXQuZG9jdW1lbnQ7ZnVuY3Rpb24gbW4odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5ldyBGdW5jdGlvbigiIit0KSk7Zm9yKHZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdPWFyZ3VtZW50c1tyKzFdO3ZhciBuPXtjYWxsYmFjazp0LGFyZ3M6ZX07cmV0dXJuIGJuW3luXT1uLGduKHluKSx5bisrfWZ1bmN0aW9uIF9uKHQpe2lmKHZuKXNldFRpbWVvdXQoX24sMCx0KTtlbHNle3ZhciBlPWJuW3RdO2lmKGUpe3ZuPSEwO3RyeXshZnVuY3Rpb24odCl7dmFyIGU9dC5jYWxsYmFjayxyPXQuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDplKCk7YnJlYWs7Y2FzZSAxOmUoclswXSk7YnJlYWs7Y2FzZSAyOmUoclswXSxyWzFdKTticmVhaztjYXNlIDM6ZShyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDplLmFwcGx5KHZvaWQgMCxyKX19KGUpfWZpbmFsbHl7IWZ1bmN0aW9uKHQpe2RlbGV0ZSBiblt0XX0odCksdm49ITF9fX19dmFyIFNuLEVuLGtuLFJuLGpuPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Z1bmN0aW9uIFRuKHQpe2xldCBlLHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO2lmKGU9IltvYmplY3QgUHJvbWlzZV0iPT09cixlKXJldHVybiEwO2lmKCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1yKXJldHVybiExO3RyeXtlPSJmdW5jdGlvbiIhPXR5cGVvZiB0LnN1YnNjcmliZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1jYXRjaCh0KXt9cmV0dXJuIGV9ZnVuY3Rpb24gT24odCl7bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7KCh0PWkpaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8QXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhYXQuaXNCdWZmZXIodCkpJiYodD1hdC5mcm9tKHQpKSxlPVRuKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIWF0LmlzQnVmZmVyKHQpO3I9bz90W1N5bWJvbC5pdGVyYXRvcl0oKTpudWxsO2NvbnN0IGE9IWUmJnRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO249YT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxmbigoZnVuY3Rpb24gbyhhLHMpe2lmKGUpcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLGEscyl9Y2F0Y2godCl7cyh0KX19KSgpO2lmKHIpe2NvbnN0IHQ9ci5uZXh0KCk7cmV0dXJuIHZvaWQgbW4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWlmKG4pcmV0dXJuIHZvaWQoYXN5bmMoKT0+e3RyeXtjb25zdCB0PWF3YWl0IG4ubmV4dCgpO21uKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1jYXRjaCh0KXttbihzLHQpfX0pKCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB2b2lkIG1uKHMsbnVsbCxudWxsKTtjb25zdCB1PXQuc2xpY2UoMCxhKTt0PXQuc2xpY2UoYSksbW4ocyxudWxsLHUpfSkpfWpuPWpuJiZqbi5zZXRUaW1lb3V0P2puOnQsIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbCh0LnByb2Nlc3MpP2duPWZ1bmN0aW9uKHQpe1IubmV4dFRpY2soKGZ1bmN0aW9uKCl7X24odCl9KSl9OiFmdW5jdGlvbigpe2lmKHQucG9zdE1lc3NhZ2UmJiF0LmltcG9ydFNjcmlwdHMpe3ZhciBlPSEwLHI9dC5vbm1lc3NhZ2U7cmV0dXJuIHQub25tZXNzYWdlPWZ1bmN0aW9uKCl7ZT0hMX0sdC5wb3N0TWVzc2FnZSgiIiwiKiIpLHQub25tZXNzYWdlPXIsZX19KCk/dC5NZXNzYWdlQ2hhbm5lbD8oKEVuPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe19uKHQuZGF0YSl9LGduPWZ1bmN0aW9uKHQpe0VuLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6d24mJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gd24uY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KFNuPXduLmRvY3VtZW50RWxlbWVudCxnbj1mdW5jdGlvbih0KXt2YXIgZT13bi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe19uKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsU24ucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxTbi5hcHBlbmRDaGlsZChlKX0pOmduPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoX24sMCx0KX06KGtuPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixSbj1mdW5jdGlvbihlKXtlLnNvdXJjZT09PXQmJiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09ZS5kYXRhLmluZGV4T2Yoa24pJiZfbigrZS5kYXRhLnNsaWNlKGtuLmxlbmd0aCkpfSx0LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixSbiwhMSk6dC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixSbiksZ249ZnVuY3Rpb24oZSl7dC5wb3N0TWVzc2FnZShrbitlLCIqIil9KSxPbi5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9VG4odD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksZm4ub2JqKChmdW5jdGlvbiBvKGEscyl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLGEscyl9Y2F0Y2godCl7cyh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTttbihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7bW4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe21uKHMsdCl9fSkoKToodGhpcy5wdXNoKHQpLG1uKHMsbnVsbCxudWxsKSl9KSl9O3ZhciBBbj17fSxDbj1Bbi5MRUZUX0JSQUNFPTEsTW49QW4uUklHSFRfQlJBQ0U9Mix4bj1Bbi5MRUZUX0JSQUNLRVQ9MyxMbj1Bbi5SSUdIVF9CUkFDS0VUPTQsQm49QW4uQ09MT049NSxQbj1Bbi5DT01NQT02LFVuPUFuLlRSVUU9NyxObj1Bbi5GQUxTRT04LERuPUFuLk5VTEw9OSxJbj1Bbi5TVFJJTkc9MTAscW49QW4uTlVNQkVSPTExLEZuPUFuLlNUQVJUPTE3LFduPUFuLlNUT1A9MTgsem49QW4uVFJVRTE9MzMsWW49QW4uVFJVRTI9MzQsJG49QW4uVFJVRTM9MzUsSG49QW4uRkFMU0UxPTQ5LEpuPUFuLkZBTFNFMj01MCxHbj1Bbi5GQUxTRTM9NTEsVm49QW4uRkFMU0U0PTUyLEtuPUFuLk5VTEwxPTY1LFpuPUFuLk5VTEwyPTY2LFhuPUFuLk5VTEwzPTY3LFFuPUFuLk5VTUJFUjE9ODEsdGk9QW4uTlVNQkVSMz04MyxlaT1Bbi5TVFJJTkcxPTk3LHJpPUFuLlNUUklORzI9OTgsbmk9QW4uU1RSSU5HMz05OSxpaT1Bbi5TVFJJTkc0PTEwMCxvaT1Bbi5TVFJJTkc1PTEwMSxhaT1Bbi5TVFJJTkc2PTEwMixzaT1Bbi5WQUxVRT0xMTMsdWk9QW4uS0VZPTExNCxmaT1Bbi5PQkpFQ1Q9MTI5LGhpPUFuLkFSUkFZPTEzMCxsaT0iXFwiLmNoYXJDb2RlQXQoMCksY2k9Ii8iLmNoYXJDb2RlQXQoMCksZGk9IlxiIi5jaGFyQ29kZUF0KDApLHBpPSJcZiIuY2hhckNvZGVBdCgwKSxnaT0iXG4iLmNoYXJDb2RlQXQoMCkseWk9IlxyIi5jaGFyQ29kZUF0KDApLGJpPSJcdCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiB2aSgpe3RoaXMudFN0YXRlPUZuLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1hdC5hbGxvYz9hdC5hbGxvYyg2NTUzNik6bmV3IGF0KDY1NTM2KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9c2ksdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBhdCgyKSwzOm5ldyBhdCgzKSw0Om5ldyBhdCg0KX0sdGhpcy5vZmZzZXQ9LTF9dmkudG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhBbikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZihBbltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB3aT12aS5wcm90b3R5cGU7d2kub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx3aS5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Xbix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK3ZpLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0sd2kuYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSx3aS5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj42NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHdpLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IGF0KHQpKTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodGhpcy50U3RhdGU9PT1Gbil7aWYoZT10W3JdLHRoaXMub2Zmc2V0KyssMTIzPT09ZSl0aGlzLm9uVG9rZW4oQ24sInsiKTtlbHNlIGlmKDEyNT09PWUpdGhpcy5vblRva2VuKE1uLCJ9Iik7ZWxzZSBpZig5MT09PWUpdGhpcy5vblRva2VuKHhuLCJbIik7ZWxzZSBpZig5Mz09PWUpdGhpcy5vblRva2VuKExuLCJdIik7ZWxzZSBpZig1OD09PWUpdGhpcy5vblRva2VuKEJuLCI6Iik7ZWxzZSBpZig0ND09PWUpdGhpcy5vblRva2VuKFBuLCIsIik7ZWxzZSBpZigxMTY9PT1lKXRoaXMudFN0YXRlPXpuO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLnRTdGF0ZT1IbjtlbHNlIGlmKDExMD09PWUpdGhpcy50U3RhdGU9S247ZWxzZSBpZigzND09PWUpdGhpcy5zdHJpbmc9IiIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDQ1PT09ZSl0aGlzLnN0cmluZz0iLSIsdGhpcy50U3RhdGU9UW47ZWxzZSBpZihlPj00OCYmZTw2NCl0aGlzLnN0cmluZz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXRpO2Vsc2UgaWYoMzIhPT1lJiY5IT09ZSYmMTAhPT1lJiYxMyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscil9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PWVpKWlmKGU9dFtyXSx0aGlzLmJ5dGVzX3JlbWFpbmluZz4wKXtmb3IodmFyIGk9MDtpPHRoaXMuYnl0ZXNfcmVtYWluaW5nO2krKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10aGlzLmJ5dGVzX3JlbWFpbmluZytpXT10W2ldO3RoaXMuYXBwZW5kU3RyaW5nQnVmKHRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXSksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZT10aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHI9citpLTF9ZWxzZSBpZigwPT09dGhpcy5ieXRlc19yZW1haW5pbmcmJmU+PTEyOCl7aWYoZTw9MTkzfHxlPjI0NClyZXR1cm4gdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiSW52YWxpZCBVVEYtOCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gIityKyIgaW4gc3RhdGUgIit2aS50b2tuYW0odGhpcy50U3RhdGUpKSk7aWYoZT49MTk0JiZlPD0yMjMmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTIpLGU+PTIyNCYmZTw9MjM5JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0zKSxlPj0yNDAmJmU8PTI0NCYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9NCksdGhpcy5ieXRlc19pbl9zZXF1ZW5jZStyPnQubGVuZ3RoKXtmb3IodmFyIG89MDtvPD10Lmxlbmd0aC0xLXI7bysrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVtvXT10W3Irb107dGhpcy5ieXRlc19yZW1haW5pbmc9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXQubGVuZ3RoLHI9dC5sZW5ndGgtMX1lbHNlIHRoaXMuYXBwZW5kU3RyaW5nQnVmKHQscixyK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UpLHI9cit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLTF9ZWxzZSBpZigzND09PWUpdGhpcy50U3RhdGU9Rm4sdGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMub25Ub2tlbihJbix0aGlzLnN0cmluZyksdGhpcy5vZmZzZXQrPWF0LmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1yaTtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09cmkpaWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGxpKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoY2kpLHRoaXMudFN0YXRlPWVpO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihkaSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihwaSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihnaSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcih5aSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihiaSksdGhpcy50U3RhdGU9ZWk7ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT1uaX1lbHNlIGlmKHRoaXMudFN0YXRlPT09bml8fHRoaXMudFN0YXRlPT09aWl8fHRoaXMudFN0YXRlPT09b2l8fHRoaXMudFN0YXRlPT09YWkpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PWFpKXt2YXIgYT1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZhPj01NjMyMCYmYTw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLGEpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZhPj01NTI5NiYmYTw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9YToodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlKSkpLHRoaXMuaGlnaFN1cnJvZ2F0ZT12b2lkIDApLHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBhdChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKSkpLHRoaXMudFN0YXRlPWVpfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09UW58fHRoaXMudFN0YXRlPT09dGkpc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXRpO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9Rm47dmFyIHM9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihzKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZzLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihJbix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKHFuLHMpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT16bil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Zbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09WW4pe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9JG59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSRuKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZuLHRoaXMub25Ub2tlbihVbiwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUhuKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Sm59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUpuKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUdufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Hbil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Wbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Vm4pe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Rm4sdGhpcy5vblRva2VuKE5uLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09S24pe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Wm59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVpuKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVhufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ybil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gbix0aGlzLm9uVG9rZW4oRG4sbnVsbCksdGhpcy5vZmZzZXQrPTN9fSx3aS5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSx3aS5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9V24sdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK3ZpLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrdmkudG9rbmFtKHRoaXMuc3RhdGUpKSl9LHdpLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHdpLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPXNpKX0sd2kuZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPVBuKSx0aGlzLm9uVmFsdWUodCl9LHdpLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSx3aS5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PXNpKWlmKHQ9PT1Jbnx8dD09PXFufHx0PT09VW58fHQ9PT1Obnx8dD09PURuKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09Q24pdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9dWksdGhpcy5tb2RlPWZpO2Vsc2UgaWYodD09PXhuKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPWhpLHRoaXMuc3RhdGU9c2k7ZWxzZSBpZih0PT09TW4pe2lmKHRoaXMubW9kZSE9PWZpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PUxuKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1oaSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT11aSlpZih0PT09SW4pdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPUJuO2Vsc2V7aWYodCE9PU1uKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PUJuKXtpZih0IT09Qm4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9c2l9ZWxzZXtpZih0aGlzLnN0YXRlIT09UG4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT1Qbil0aGlzLm1vZGU9PT1oaT8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPXNpKTp0aGlzLm1vZGU9PT1maSYmKHRoaXMuc3RhdGU9dWkpO2Vsc2V7aWYoISh0PT09TG4mJnRoaXMubW9kZT09PWhpfHx0PT09TW4mJnRoaXMubW9kZT09PWZpKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSx2aS5DPUFuO3ZhciBtaT12aTtmdW5jdGlvbiBfaSgpe3RoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9X2kucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSxfaS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sX2kucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sX2kucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LF9pLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sX2kucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGF0LmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPWF0LmFsbG9jVW5zYWZlKHQ+Pj4wKSxyPXRoaXMuaGVhZCxuPTA7cjspci5kYXRhLmNvcHkoZSxuKSxuKz1yLmRhdGEubGVuZ3RoLHI9ci5uZXh0O3JldHVybiBlfTt2YXIgU2k9YXQuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBFaSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhU2kodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPVJpO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWppO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT1raSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBhdCg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIGtpKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIFJpKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBqaSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9RWkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxFaS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxFaS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0sQWkuUmVhZGFibGVTdGF0ZT1PaTt2YXIgVGk9cmUoInN0cmVhbSIpO2Z1bmN0aW9uIE9pKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIHJvJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyBfaSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyBFaSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIEFpKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEFpKSlyZXR1cm4gbmV3IEFpKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IE9pKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLEwuY2FsbCh0aGlzKX1mdW5jdGlvbiBDaSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDthdC5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAseGkodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBhPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixhKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZ4aSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsYyhCaSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfUt0KEFpLEwpLEFpLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PWF0LmZyb20odCxlKSxlPSIiKSxDaSh0aGlzLHIsdCxlLCExKX0sQWkucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIENpKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0sQWkucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LEFpLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBFaSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gTWkodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiB4aSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoVGkoImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/YyhMaSx0KTpMaSh0KSl9ZnVuY3Rpb24gTGkodCl7VGkoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksTmkodCl9ZnVuY3Rpb24gQmkodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKFRpKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gUGkodCl7VGkoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiBVaSh0LGUpe2UucmVhZGluZ3x8KFRpKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLE5pKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIE5pKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKFRpKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIERpKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoYT09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKGEpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1hdC5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLGE9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxhKSwwPT09KHQtPWEpKXthPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShhKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gSWkodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCxjKHFpLGUsdCkpfWZ1bmN0aW9uIHFpKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBGaSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBXaSgpe31mdW5jdGlvbiB6aSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gWWkodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OlF0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2Ygcm8mJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj9jKGksbik6aShuKTt0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPVZpKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8R2kodCxyKSxuP2MoSmksdCxyLG8saSk6SmkodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBYaSh0aGlzKX1mdW5jdGlvbiAkaSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiAkaXx8dGhpcyBpbnN0YW5jZW9mIHJvKSlyZXR1cm4gbmV3ICRpKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IFlpKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpKSxMLmNhbGwodGhpcyl9ZnVuY3Rpb24gSGkodCxlLHIsbixpLG8sYSl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1hLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBKaSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLFppKHQsZSl9ZnVuY3Rpb24gR2kodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBhPTA7cjspaVthXT1yLHI9ci5uZXh0LGErPTE7SGkodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBYaShlKX1lbHNle2Zvcig7cjspe3ZhciBzPXIuY2h1bmssdT1yLmVuY29kaW5nLGY9ci5jYWxsYmFjaztpZihIaSh0LGUsITEsZS5vYmplY3RNb2RlPzE6cy5sZW5ndGgscyx1LGYpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gVmkodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gS2kodCxlKXtlLnByZWZpbmlzaGVkfHwoZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKX1mdW5jdGlvbiBaaSh0LGUpe3ZhciByPVZpKGUpO3JldHVybiByJiYoMD09PWUucGVuZGluZ2NiPyhLaSh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSk6S2kodCxlKSkscn1mdW5jdGlvbiBYaSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbihyKXt2YXIgbj1lLmVudHJ5O2ZvcihlLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7dC5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fXQuY29ya2VkUmVxdWVzdHNGcmVlP3QuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9ZTp0LmNvcmtlZFJlcXVlc3RzRnJlZT1lfX1BaS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtUaSgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gVGkoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP0lpKHRoaXMpOnhpKHRoaXMpLG51bGw7aWYoMD09PSh0PU1pKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJklpKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gVGkoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmVGkoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/VGkoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihUaSgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1NaShyLGUpKSksbnVsbD09PShuPXQ+MD9EaSh0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJklpKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxBaS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LEFpLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsVGkoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSFlfHwhMSE9PWUuZW5kP2E6ZjtmdW5jdGlvbiBvKHQpe1RpKCJvbnVucGlwZSIpLHQ9PT1yJiZmKCl9ZnVuY3Rpb24gYSgpe1RpKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP2MoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtUaSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCxOaSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIscyk7dmFyIHU9ITE7ZnVuY3Rpb24gZigpe1RpKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZyksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLHMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixkKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixsKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8cygpfXZhciBoPSExO2Z1bmN0aW9uIGwoZSl7VGkoIm9uZGF0YSIpLGg9ITEsITEhPT10LndyaXRlKGUpfHxofHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1GaShuLnBpcGVzLHQpKSYmIXUmJihUaSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGg9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gZChlKXt2YXIgcjtUaSgib25lcnJvciIsZSkseSgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixkKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixnKSx5KCl9ZnVuY3Rpb24gZygpe1RpKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx5KCl9ZnVuY3Rpb24geSgpe1RpKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsbCksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsZCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGcpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoVGkoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0sQWkucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPUZpKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSxBaS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlKXt2YXIgcj1MLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxlKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBuPXRoaXMuX3JlYWRhYmxlU3RhdGU7bi5lbmRFbWl0dGVkfHxuLnJlYWRhYmxlTGlzdGVuaW5nfHwobi5yZWFkYWJsZUxpc3RlbmluZz1uLm5lZWRSZWFkYWJsZT0hMCxuLmVtaXR0ZWRSZWFkYWJsZT0hMSxuLnJlYWRpbmc/bi5sZW5ndGgmJnhpKHRoaXMpOmMoUGksdGhpcykpfXJldHVybiByfSxBaS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9QWkucHJvdG90eXBlLm9uLEFpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiB0LmZsb3dpbmd8fChUaSgicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCxjKFVpLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxBaS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gVGkoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKFRpKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LEFpLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoVGkoIndyYXBwZWQgZW5kIiksZS5kZWNvZGVyJiYhZS5lbmRlZCl7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZuLnB1c2godCl9bi5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoVGkoIndyYXBwZWQgZGF0YSIpLGUuZGVjb2RlciYmKGk9ZS5kZWNvZGVyLndyaXRlKGkpKSxlLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoZS5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihuLnB1c2goaSl8fChyPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfShbImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXSwoZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSkpLG4uX3JlYWQ9ZnVuY3Rpb24oZSl7VGkoIndyYXBwZWQgX3JlYWQiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxBaS5fZnJvbUxpc3Q9RGksJGkuV3JpdGFibGVTdGF0ZT1ZaSxLdCgkaSxMKSxZaS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSwkaS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0sJGkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxhdC5pc0J1ZmZlcih0KT9lPSJidWZmZXIiOmV8fChlPW4uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9V2kpLG4uZW5kZWQ/ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgRXJyb3IoIndyaXRlIGFmdGVyIGVuZCIpO3QuZW1pdCgiZXJyb3IiLHIpLGMoZSxyKX0odGhpcyxyKTpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6YXQuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2Ygcnx8dm9pZCAwPT09cnx8ZS5vYmplY3RNb2RlfHwobz1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpLG8mJih0LmVtaXQoImVycm9yIixvKSxjKG4sbyksaT0hMSksaX0odGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpKXtyPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPWF0LmZyb20oZSxyKSk7cmV0dXJuIGV9KGUscixuKSxhdC5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBhPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyazthfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBzPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IHppKHIsbixpKSxzP3MubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBIaSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIGF9KHRoaXMsbix0LGUscikpLGl9LCRpLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sJGkucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxHaSh0aGlzLHQpKX0sJGkucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sJGkucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sJGkucHJvdG90eXBlLl93cml0ZXY9bnVsbCwkaS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAsWmkodCxlKSxyJiYoZS5maW5pc2hlZD9jKHIpOnQub25jZSgiZmluaXNoIixyKSk7ZS5lbmRlZD0hMCx0LndyaXRhYmxlPSExfSh0aGlzLG4scil9LEt0KHJvLEFpKTtmb3IodmFyIFFpPU9iamVjdC5rZXlzKCRpLnByb3RvdHlwZSksdG89MDt0bzxRaS5sZW5ndGg7dG8rKyl7dmFyIGVvPVFpW3RvXTtyby5wcm90b3R5cGVbZW9dfHwocm8ucHJvdG90eXBlW2VvXT0kaS5wcm90b3R5cGVbZW9dKX1mdW5jdGlvbiBybyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBybykpcmV0dXJuIG5ldyBybyh0KTtBaS5jYWxsKHRoaXMsdCksJGkuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLG5vKX1mdW5jdGlvbiBubygpe3RoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8Yyhpbyx0aGlzKX1mdW5jdGlvbiBpbyh0KXt0LmVuZCgpfWZ1bmN0aW9uIG9vKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuX3RyYW5zZm9ybVN0YXRlO24udHJhbnNmb3JtaW5nPSExO3ZhciBpPW4ud3JpdGVjYjtpZighaSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1yJiZ0LnB1c2gocik7aShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX0odCxlLHIpfSx0aGlzLm5lZWRUcmFuc2Zvcm09ITEsdGhpcy50cmFuc2Zvcm1pbmc9ITEsdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWNodW5rPW51bGwsdGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gYW8odCl7aWYoISh0aGlzIGluc3RhbmNlb2YgYW8pKXJldHVybiBuZXcgYW8odCk7cm8uY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBvbyh0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uY2UoInByZWZpbmlzaCIsKGZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbih0KXtzbyhlLHQpfSkpOnNvKGUpfSkpfWZ1bmN0aW9uIHNvKHQsZSl7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYobi50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1mdW5jdGlvbiB1byh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB1bykpcmV0dXJuIG5ldyB1byh0KTthby5jYWxsKHRoaXMsdCl9ZnVuY3Rpb24gZm8oKXtMLmNhbGwodGhpcyl9ZnVuY3Rpb24gaG8odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxhPSExLHM9bmV3IGZvO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhcy5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIHMuZW1pdCgiZW5kIik7cy5lbWl0KCJkYXRhIix0KX19ZnVuY3Rpb24gZigpe3Mud3JpdGFibGU9ITEsZS5jYWxsKHMpLCFzLnJlYWRhYmxlJiZzLmF1dG9EZXN0cm95JiZzLmRlc3Ryb3koKX1yZXR1cm4gcy5yZWFkYWJsZT1zLndyaXRhYmxlPSEwLHMucGF1c2VkPSExLHMuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLHMud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFzLnBhdXNlZH0scy5xdWV1ZT1zLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIGF8fChudWxsPT09dCYmKGE9ITApLG8ucHVzaCh0KSx1KCkpLHN9LHMub24oImVuZCIsKGZ1bmN0aW9uKCl7cy5yZWFkYWJsZT0hMSwhcy53cml0YWJsZSYmcy5hdXRvRGVzdHJveSYmUi5uZXh0VGljaygoZnVuY3Rpb24oKXtzLmRlc3Ryb3koKX0pKX0pKSxzLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZzLndyaXRlKHQpLGYoKSxzfSxzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAscy53cml0YWJsZT1zLnJlYWRhYmxlPSExLHMuZW1pdCgiY2xvc2UiKSxzfSxzLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIXMucGF1c2VkKXJldHVybiBzLnBhdXNlZD0hMCxzfSxzLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBzLnBhdXNlZCYmKHMucGF1c2VkPSExLHMuZW1pdCgicmVzdW1lIikpLHUoKSxzLnBhdXNlZHx8cy5lbWl0KCJkcmFpbiIpLHN9LHN9S3QoYW8scm8pLGFvLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEscm8ucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LGFvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxhby5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LGFvLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0sS3QodW8sYW8pLHVvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9LEt0KGZvLEwpLGZvLlJlYWRhYmxlPUFpLGZvLldyaXRhYmxlPSRpLGZvLkR1cGxleD1ybyxmby5UcmFuc2Zvcm09YW8sZm8uUGFzc1Rocm91Z2g9dW8sZm8uU3RyZWFtPWZvLGZvLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztmdW5jdGlvbiBuKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmci5wYXVzZSYmci5wYXVzZSgpfWZ1bmN0aW9uIGkoKXtyLnJlYWRhYmxlJiZyLnJlc3VtZSYmci5yZXN1bWUoKX1yLm9uKCJkYXRhIixuKSx0Lm9uKCJkcmFpbiIsaSksdC5faXNTdGRpb3x8ZSYmITE9PT1lLmVuZHx8KHIub24oImVuZCIsYSksci5vbigiY2xvc2UiLHMpKTt2YXIgbz0hMTtmdW5jdGlvbiBhKCl7b3x8KG89ITAsdC5lbmQoKSl9ZnVuY3Rpb24gcygpe298fChvPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJnQuZGVzdHJveSgpKX1mdW5jdGlvbiB1KHQpe2lmKGYoKSwwPT09TC5saXN0ZW5lckNvdW50KHRoaXMsImVycm9yIikpdGhyb3cgdH1mdW5jdGlvbiBmKCl7ci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGkpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksci5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHMpLHIucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxyLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpfXJldHVybiByLm9uKCJlcnJvciIsdSksdC5vbigiZXJyb3IiLHUpLHIub24oImVuZCIsZiksci5vbigiY2xvc2UiLGYpLHQub24oImNsb3NlIixmKSx0LmVtaXQoInBpcGUiLHIpLHR9LGhvLnRocm91Z2g9aG87bGV0IGxvPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgbWksYT1obygoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1hdC5mcm9tKHQpKSxvLndyaXRlKHQpfSksKGZ1bmN0aW9uKHQpe3QmJmEud3JpdGUodCksciYmYS5lbWl0KCJoZWFkZXIiLHIpLG4mJmEuZW1pdCgiZm9vdGVyIixuKSxhLnF1ZXVlKG51bGwpfSkpO2Z1bmN0aW9uIHModCxlKXshMSE9PXImJihyPXJ8fHt9LHJbdF09ZSksITEhPT1uJiYhMT09PXImJihuPW58fHt9LG5bdF09ZSl9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iJCoiPT09dD97ZW1pdEtleTohMH06IioiPT09dHx8KCIiPT09dD97cmVjdXJzZTohMH06dCl9KSkpLHQmJnQubGVuZ3RofHwodD1udWxsKSxvLm9uVmFsdWU9ZnVuY3Rpb24obil7aWYodGhpcy5yb290fHwoYS5yb290PW4pLCF0KXJldHVybjtsZXQgbz0wLHU9MCxmPSExLGg9ITE7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGUscj10W29dO2lmKHUrKyxyJiYhci5yZWN1cnNlKXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKCFpKHIsZS5rZXkpKXJldHVybiB2b2lkIHMoZS5rZXksbik7Zj0hIXIuZW1pdEtleSxoPSEhci5lbWl0UGF0aCxvKyt9ZWxzZXtvKys7bGV0IHI9dFtvXTtpZighcilyZXR1cm47Zm9yKDs7KXtpZihlPXU9PT10aGlzLnN0YWNrLmxlbmd0aD90aGlzOnRoaXMuc3RhY2tbdV0sIWUpcmV0dXJuO2lmKGkocixlLmtleSkpe28rKyxPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t1XSl8fCh0aGlzLnN0YWNrW3VdLnZhbHVlPW51bGwpO2JyZWFrfXMoZS5rZXksbiksdSsrfX19aWYociYmKGEuZW1pdCgiaGVhZGVyIixyKSxyPSExKSx1IT09dGhpcy5zdGFjay5sZW5ndGgpcmV0dXJuO2xldCBsPXRoaXMuc3RhY2suc2xpY2UoMSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSkuY29uY2F0KFt0aGlzLmtleV0pLGM9bjtudWxsIT1jJiZudWxsIT0oYz1lP2UoYyxsKTpjKSYmKChmfHxoKSYmKGM9e3ZhbHVlOmN9LGYmJihjLmtleT10aGlzLmtleSksaCYmKGMucGF0aD1sKSksYS5xdWV1ZShjKSksdGhpcy52YWx1ZSYmZGVsZXRlIHRoaXMudmFsdWVbdGhpcy5rZXldO2ZvcihsZXQgdCBpbiB0aGlzLnN0YWNrKU9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3RdKXx8KHRoaXMuc3RhY2tbdF0udmFsdWU9bnVsbCl9LG8uX29uVG9rZW49by5vblRva2VuLG8ub25Ub2tlbj1mdW5jdGlvbihlLHIpe28uX29uVG9rZW4oZSxyKSwwPT09dGhpcy5zdGFjay5sZW5ndGgmJmEucm9vdCYmKHR8fGEucXVldWUoYS5yb290KSxhLnJvb3Q9bnVsbCl9LG8ub25FcnJvcj1mdW5jdGlvbih0KXt0Lm1lc3NhZ2UuaW5kZXhPZigiYXQgcG9zaXRpb24iKT4tMSYmKHQubWVzc2FnZT0iSW52YWxpZCBKU09OICgiK3QubWVzc2FnZSsiKSIpLGEuZW1pdCgiZXJyb3IiLHQpfSxhfX0sY289ZnVuY3Rpb24odCxlKXtyZXR1cm4gY289T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKGxldCByIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRbcl09ZVtyXSl9LGNvKHQsZSl9O2xldCBwbyxnbz0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2cseW89eyJcYiI6IlxcYiIsIlx0IjoiXFx0IiwiXG4iOiJcXG4iLCJcZiI6IlxcZiIsIlxyIjoiXFxyIiwnIic6J1xcIicsIlxcIjoiXFxcXCJ9O2Z1bmN0aW9uIGJvKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4/cG8uUHJvbWlzZTpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5waXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5vbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZW1vdmVMaXN0ZW5lcn0odCk/dC5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlP3BvLlJlYWRhYmxlT2JqZWN0OnBvLlJlYWRhYmxlU3RyaW5nOkFycmF5LmlzQXJyYXkodCk/cG8uQXJyYXk6Im9iamVjdCI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgT2JqZWN0P3BvLk9iamVjdDpwby5QcmltaXRpdmU6cG8uUHJpbWl0aXZlfSFmdW5jdGlvbih0KXt0W3QuQXJyYXk9MF09IkFycmF5Iix0W3QuT2JqZWN0PTFdPSJPYmplY3QiLHRbdC5SZWFkYWJsZVN0cmluZz0yXT0iUmVhZGFibGVTdHJpbmciLHRbdC5SZWFkYWJsZU9iamVjdD0zXT0iUmVhZGFibGVPYmplY3QiLHRbdC5QcmltaXRpdmU9NF09IlByaW1pdGl2ZSIsdFt0LlByb21pc2U9NV09IlByb21pc2UifShwb3x8KHBvPXt9KSk7bGV0IHZvPVtdO3ZvW3BvLkFycmF5XT0iWyIsdm9bcG8uT2JqZWN0XT0ieyIsdm9bcG8uUmVhZGFibGVTdHJpbmddPSciJyx2b1twby5SZWFkYWJsZU9iamVjdF09IlsiO2xldCB3bz1bXTt3b1twby5BcnJheV09Il0iLHdvW3BvLk9iamVjdF09In0iLHdvW3BvLlJlYWRhYmxlU3RyaW5nXT0nIicsd29bcG8uUmVhZGFibGVPYmplY3RdPSJdIjtsZXQgbW89W107Zm9yKGxldCB0PTAsZT1PYmplY3QuZW50cmllcyhwbyk7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF0sbj1yWzBdLGk9clsxXTsibnVtYmVyIj09dHlwZW9mIGkmJihtb1tpXT0icHJvY2VzcyIrbil9ZnVuY3Rpb24gX28odCl7cmV0dXJuIHQucmVwbGFjZShnbywoZnVuY3Rpb24odCl7bGV0IGU9eW9bdF07cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2U6IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCIwIil9KSl9ZnVuY3Rpb24gU28odCl7cmV0dXJuJyInK19vKHQpKyciJ31mdW5jdGlvbiBFbyh0LGUpe2xldCByPXQucmVhZChlKTtyZXR1cm4gbnVsbD09PXI/bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7bGV0IG49ZnVuY3Rpb24oKXtyZXR1cm4gZShudWxsKX07dC5vbmNlKCJlbmQiLG4pLHQub25jZSgiZXJyb3IiLHIpLHQub25jZSgicmVhZGFibGUiLChmdW5jdGlvbigpe3QucmVtb3ZlTGlzdGVuZXIoImVuZCIsbiksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHIpLGUodC5yZWFkKCkpfSkpfSkpOlByb21pc2UucmVzb2x2ZShyKX1mdW5jdGlvbiBrbyh0KXtyZXR1cm4gdC50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gYm8odCk9PT1wby5Qcm9taXNlP2tvKHQpOnR9KSl9bGV0IFJvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyLG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO2xldCBvPXQuY2FsbCh0aGlzKXx8dGhpcztvLmN5Y2xlPWksby5zdGFjaz1bXSxvLmRlcHRoPTAsby5wdXNoQ2FsbGVkPSExLG8uZW5kPSExLG8uaXNSZWFkaW5nPSExLG8ucmVhZE1vcmU9ITE7bGV0IGE9dHlwZW9mIG47cmV0dXJuInN0cmluZyIhPT1hJiYibnVtYmVyIiE9PWF8fChvLmdhcD1OdW1iZXIuaXNGaW5pdGUobik/IiAiLnJlcGVhdChuKTpuKSxPYmplY3QuYXNzaWduKG8se3Zpc2l0ZWQ6aT9uZXcgV2Vha01hcDpuZXcgV2Vha1NldCxyZXBsYWNlckZ1bmN0aW9uOnIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmcixyZXBsYWNlckFycmF5OkFycmF5LmlzQXJyYXkocikmJnJ9KSxyIGluc3RhbmNlb2YgRnVuY3Rpb24mJihvLnJlcGxhY2VyRnVuY3Rpb249ciksQXJyYXkuaXNBcnJheShyKSYmKG8ucmVwbGFjZXJBcnJheT1yKSxvLmFkZFRvU3RhY2soZSksb31yZXR1cm4gZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWNvKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IHIpfShlLHQpLGUucHJvdG90eXBlLmN5Y2xlcj1mdW5jdGlvbih0LGUpe2xldCByPXRoaXMudmlzaXRlZC5nZXQoZSk7aWYocilyZXR1cm57JHJlZjpyfTtsZXQgbj10aGlzLnBhdGgoKTtyZXR1cm4gdm9pZCAwIT09dCYmbi5wdXNoKHQpLG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiJbIisoTnVtYmVyLmlzSW50ZWdlcih0KT90OlNvKHQpKSsiXSJ9KSksdGhpcy52aXNpdGVkLnNldChlLG4ubGVuZ3RoPyIkIituLmpvaW4oIiIpOiIkIiksZX0sZS5wcm90b3R5cGUuYWRkVG9TdGFjaz1mdW5jdGlvbih0LGUscixuKXtsZXQgaSxvLGE9dGhpcyxzPXQ7dGhpcy5yZXBsYWNlckZ1bmN0aW9uJiYocz10aGlzLnJlcGxhY2VyRnVuY3Rpb24oZXx8cixzLHRoaXMpKSxzJiZzLnRvSlNPTiBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYocz1zLnRvSlNPTigpKSwocyBpbnN0YW5jZW9mIEZ1bmN0aW9ufHwic3ltYm9sIj09dHlwZW9mIHQpJiYocz12b2lkIDApLHZvaWQgMCE9PWUmJnRoaXMucmVwbGFjZXJBcnJheSYmKHRoaXMucmVwbGFjZXJBcnJheS5pbmNsdWRlcyhlKXx8KHM9dm9pZCAwKSk7bGV0IHU9Ym8ocyk7aWYoKG4mJm4udHlwZT09PXBvLkFycmF5fHx2b2lkIDAhPT1zKSYmdSE9PXBvLlByb21pc2UmJihuJiYhbi5maXJzdCYmdGhpcy5fcHVzaCgiLCIpLG4mJihuLmZpcnN0PSExKSksdm9pZCAwIT09cyYmdSE9PXBvLlByb21pc2UmJmUmJih0aGlzLmdhcD90aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKyciJytfbyhlKSsnIjogJyk6dGhpcy5fcHVzaCgnIicrX28oZSkrJyI6JykpLHUhPT1wby5QcmltaXRpdmUpaWYodGhpcy5jeWNsZSlzPXRoaXMuY3ljbGVyKGV8fHIscyksdT1ibyhzKTtlbHNle2lmKHRoaXMudmlzaXRlZC5oYXMocykpdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04iKSx7cmVhbFZhbHVlOnMsa2V5OmV8fHJ9KTt0aGlzLnZpc2l0ZWQuYWRkKHMpfSFlJiZyPi0xJiZ0aGlzLmRlcHRoJiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSk7bGV0IGY9dm9bdV07ZiYmdGhpcy5fcHVzaChmKTtsZXQgaD17a2V5OmUsaW5kZXg6cix0eXBlOnUscGFyZW50Om4sdmFsdWU6cyxmaXJzdDohMH07cmV0dXJuIHU9PT1wby5PYmplY3Q/KHRoaXMuZGVwdGgrPTEsaC51bnJlYWQ9T2JqZWN0LmtleXMocyksaC5pc0VtcHR5PSFoLnVucmVhZC5sZW5ndGgpOnU9PT1wby5BcnJheT8odGhpcy5kZXB0aCs9MSxoLnVucmVhZD1zLmxlbmd0aCxoLmFycmF5TGVuZ3RoPWgudW5yZWFkLGguaXNFbXB0eT0haC51bnJlYWQpOnUhPT1wby5SZWFkYWJsZVN0cmluZyYmdSE9PXBvLlJlYWRhYmxlT2JqZWN0fHwodGhpcy5kZXB0aCs9MSxzLnJlYWRhYmxlRW5kZWR8fChudWxsPT09KGk9cy5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuZW5kRW1pdHRlZCk/dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaGFzIGVuZGVkIGJlZm9yZSBpdCB3YXMgc2VyaWFsaXplZC4gQWxsIHN0cmVhbSBkYXRhIGhhdmUgYmVlbiBsb3N0IikscyxlfHxyKToocy5yZWFkYWJsZUZsb3dpbmd8fChudWxsPT09KG89cy5fcmVhZGFibGVTdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZmxvd2luZykpJiYocy5wYXVzZSgpLHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGlzIGluIGZsb3dpbmcgbW9kZSwgZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QuIFRyeWluZyB0byBwYXVzZSBzdHJlYW0uIikscyxlfHxyKSksaC5yZWFkQ291bnQ9MCxzLm9uY2UoImVuZCIsKGZ1bmN0aW9uKCl7aC5lbmQ9ITAsYS5fX3JlYWQoKX0pKSxzLm9uY2UoImVycm9yIiwoZnVuY3Rpb24odCl7YS5lcnJvcj0hMCxhLmVtaXQoImVycm9yIix0KX0pKSksdGhpcy5zdGFjay51bnNoaWZ0KGgpLGh9LGUucHJvdG90eXBlLnJlbW92ZUZyb21TdGFjaz1mdW5jdGlvbih0KXtsZXQgZT10LnR5cGUscj1lPT09cG8uT2JqZWN0fHxlPT09cG8uQXJyYXl8fGU9PT1wby5SZWFkYWJsZVN0cmluZ3x8ZT09PXBvLlJlYWRhYmxlT2JqZWN0O2UhPT1wby5QcmltaXRpdmUmJih0aGlzLmN5Y2xlfHx0aGlzLnZpc2l0ZWQuZGVsZXRlKHQudmFsdWUpLHImJih0aGlzLmRlcHRoLT0xKSk7bGV0IG49d29bZV07ciYmIXQuaXNFbXB0eSYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpLG4mJnRoaXMuX3B1c2gobik7bGV0IGk9dGhpcy5zdGFjay5pbmRleE9mKHQpO3RoaXMuc3RhY2suc3BsaWNlKGksMSl9LGUucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMCx0aGlzLnB1c2godCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZU9iamVjdD1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBFbyh0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKGUpe251bGwhPT1lJiYodC5maXJzdHx8ci5fcHVzaCgiLCIpLHQuZmlyc3Q9ITEsci5hZGRUb1N0YWNrKGUsdm9pZCAwLHQucmVhZENvdW50KSx0LnJlYWRDb3VudCs9MSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NPYmplY3Q9ZnVuY3Rpb24odCl7aWYoIXQudW5yZWFkLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgZT10LnVucmVhZC5zaGlmdCgpLHI9dC52YWx1ZVtlXTt0aGlzLmFkZFRvU3RhY2socixlLHZvaWQgMCx0KX0sZS5wcm90b3R5cGUucHJvY2Vzc0FycmF5PWZ1bmN0aW9uKHQpe2xldCBlPXQudW5yZWFkO2lmKCFlKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCByPXQuYXJyYXlMZW5ndGgtZSxuPXQudmFsdWVbcl07dC51bnJlYWQtPTEsdGhpcy5hZGRUb1N0YWNrKG4sdm9pZCAwLHIsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcmltaXRpdmU9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dC52YWx1ZSl7bGV0IGUscj10eXBlb2YgdC52YWx1ZTtzd2l0Y2gocil7Y2FzZSJzdHJpbmciOmU9U28odC52YWx1ZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmU9TnVtYmVyLmlzRmluaXRlKHQudmFsdWUpP1N0cmluZyh0LnZhbHVlKToibnVsbCI7YnJlYWs7Y2FzZSJib29sZWFuIjplPVN0cmluZyh0LnZhbHVlKTticmVhaztjYXNlIm9iamVjdCI6dC52YWx1ZXx8KGU9Im51bGwiKTticmVhaztkZWZhdWx0OnRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdVbmtub3duIHR5cGUgIicrcisnIi4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJykse3ZhbHVlOnQudmFsdWV9KX10aGlzLl9wdXNoKGUpfWVsc2UhdGhpcy5zdGFja1sxXXx8dGhpcy5zdGFja1sxXS50eXBlIT09cG8uQXJyYXkmJnRoaXMuc3RhY2tbMV0udHlwZSE9PXBvLlJlYWRhYmxlT2JqZWN0P3QuYWRkU2VwYXJhdG9yQWZ0ZXJFbmQ9ITE6dGhpcy5fcHVzaCgibnVsbCIpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVTdHJpbmc9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gRW8odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbih0KXt0JiZyLl9wdXNoKF9vKHQudG9TdHJpbmcoKSkpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJvbWlzZT1mdW5jdGlvbih0KXtsZXQgZT10aGlzO3JldHVybiBrbyh0LnZhbHVlKS50aGVuKChmdW5jdGlvbihyKXtlLnJlbW92ZUZyb21TdGFjayh0KSxlLmFkZFRvU3RhY2socix0LmtleSx0LmluZGV4LHQucGFyZW50KX0pKX0sZS5wcm90b3R5cGUucHJvY2Vzc1N0YWNrVG9wSXRlbT1mdW5jdGlvbih0KXtsZXQgZSxyPXRoaXMsbj10aGlzLnN0YWNrWzBdO2lmKCFufHx0aGlzLmVycm9yKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTt0cnl7ZT10aGlzW21vW24udHlwZV1dKG4sdCl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfXJldHVybiBQcm9taXNlLnJlc29sdmUoZSkudGhlbigoZnVuY3Rpb24oKXswPT09ci5zdGFjay5sZW5ndGgmJihyLmVuZD0hMCxyLl9wdXNoKG51bGwpKX0pKX0sZS5wcm90b3R5cGUuX19yZWFkPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7aWYoIXRoaXMuaXNSZWFkaW5nJiYhdGhpcy5lcnJvcilyZXR1cm4gdGhpcy5pc1JlYWRpbmc9ITAsdGhpcy5yZWFkTW9yZT0hMSx0aGlzLnByb2Nlc3NTdGFja1RvcEl0ZW0odCkudGhlbigoZnVuY3Rpb24oKXshZS5lbmQmJiFlLmVycm9yJiYoZS5yZWFkTW9yZXx8IWUucHVzaENhbGxlZCk/bW4oKGZ1bmN0aW9uKCl7ZS5pc1JlYWRpbmc9ITEsZS5fX3JlYWQoKX0pKTplLmlzUmVhZGluZz0hMX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZS5lcnJvcj0hMCxlLmVtaXQoImVycm9yIix0KX0pKTt0aGlzLnJlYWRNb3JlPSEwfSxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITEsdGhpcy5fX3JlYWQodCl9LGUucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFjay5tYXAoKGZ1bmN0aW9uKHQpe2xldCBlPXQua2V5LHI9dC5pbmRleDtyZXR1cm4gZXx8cn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fHx0Pi0xfSkpLnJldmVyc2UoKX0sZX0oQWkpO3ZhciBqbz1BcnJheS5pc0FycmF5LFRvPSJvYmplY3QiPT10eXBlb2YgaiYmaiYmai5PYmplY3Q9PT1PYmplY3QmJmosT289Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixBbz1Ub3x8T298fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksQ289QW8uU3ltYm9sLE1vPU9iamVjdC5wcm90b3R5cGUseG89TW8uaGFzT3duUHJvcGVydHksTG89TW8udG9TdHJpbmcsQm89Q28/Q28udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBQbz1mdW5jdGlvbih0KXt2YXIgZT14by5jYWxsKHQsQm8pLHI9dFtCb107dHJ5e3RbQm9dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9TG8uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtCb109cjpkZWxldGUgdFtCb10pLGl9LFVvPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIE5vPWZ1bmN0aW9uKHQpe3JldHVybiBVby5jYWxsKHQpfSxEbz1Dbz9Dby50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIElvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkRvJiZEbyBpbiBPYmplY3QodCk/UG8odCk6Tm8odCl9O3ZhciBxbz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgRm89ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxxbyh0KSYmIltvYmplY3QgU3ltYm9sXSI9PUlvKHQpfSxXbz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx6bz0vXlx3KiQvO3ZhciBZbz1mdW5jdGlvbih0LGUpe2lmKGpvKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFGbyh0KSl8fCh6by50ZXN0KHQpfHwhV28udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgJG89ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciBIbyxKbz1mdW5jdGlvbih0KXtpZighJG8odCkpcmV0dXJuITE7dmFyIGU9SW8odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxHbz1Bb1siX19jb3JlLWpzX3NoYXJlZF9fIl0sVm89KEhvPS9bXi5dKyQvLmV4ZWMoR28mJkdvLmtleXMmJkdvLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitIbzoiIjt2YXIgS289ZnVuY3Rpb24odCl7cmV0dXJuISFWbyYmVm8gaW4gdH0sWm89RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBYbz1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIFpvLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxRbz0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx0YT1GdW5jdGlvbi5wcm90b3R5cGUsZWE9T2JqZWN0LnByb3RvdHlwZSxyYT10YS50b1N0cmluZyxuYT1lYS5oYXNPd25Qcm9wZXJ0eSxpYT1SZWdFeHAoIl4iK3JhLmNhbGwobmEpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBvYT1mdW5jdGlvbih0KXtyZXR1cm4hKCEkbyh0KXx8S28odCkpJiYoSm8odCk/aWE6UW8pLnRlc3QoWG8odCkpfTt2YXIgYWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIHNhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9YWEodCxlKTtyZXR1cm4gb2Eocik/cjp2b2lkIDB9LHVhPXNhKE9iamVjdCwiY3JlYXRlIik7dmFyIGZhPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz11YT91YShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIGhhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxsYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBjYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKHVhKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIGxhLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sZGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdWE/dm9pZCAwIT09ZVt0XTpkYS5jYWxsKGUsdCl9O3ZhciBnYT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09dWEmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24geWEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19eWEucHJvdG90eXBlLmNsZWFyPWZhLHlhLnByb3RvdHlwZS5kZWxldGU9aGEseWEucHJvdG90eXBlLmdldD1jYSx5YS5wcm90b3R5cGUuaGFzPXBhLHlhLnByb3RvdHlwZS5zZXQ9Z2E7dmFyIGJhPXlhO3ZhciB2YT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciB3YT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIG1hPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYod2EodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sX2E9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgU2E9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1hKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOl9hLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIEVhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1tYShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBrYT1mdW5jdGlvbih0KXtyZXR1cm4gbWEodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIFJhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPW1hKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIGphKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fWphLnByb3RvdHlwZS5jbGVhcj12YSxqYS5wcm90b3R5cGUuZGVsZXRlPVNhLGphLnByb3RvdHlwZS5nZXQ9RWEsamEucHJvdG90eXBlLmhhcz1rYSxqYS5wcm90b3R5cGUuc2V0PVJhO3ZhciBUYT1qYSxPYT1zYShBbywiTWFwIik7dmFyIEFhPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgYmEsbWFwOm5ldyhPYXx8VGEpLHN0cmluZzpuZXcgYmF9fTt2YXIgQ2E9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIE1hPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gQ2EoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH07dmFyIHhhPWZ1bmN0aW9uKHQpe3ZhciBlPU1hKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9O3ZhciBMYT1mdW5jdGlvbih0KXtyZXR1cm4gTWEodGhpcyx0KS5nZXQodCl9O3ZhciBCYT1mdW5jdGlvbih0KXtyZXR1cm4gTWEodGhpcyx0KS5oYXModCl9O3ZhciBQYT1mdW5jdGlvbih0LGUpe3ZhciByPU1hKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O2Z1bmN0aW9uIFVhKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVVhLnByb3RvdHlwZS5jbGVhcj1BYSxVYS5wcm90b3R5cGUuZGVsZXRlPXhhLFVhLnByb3RvdHlwZS5nZXQ9TGEsVWEucHJvdG90eXBlLmhhcz1CYSxVYS5wcm90b3R5cGUuc2V0PVBhO3ZhciBOYT1VYTtmdW5jdGlvbiBEYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLG89ci5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIGE9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPW8uc2V0KGksYSl8fG8sYX07cmV0dXJuIHIuY2FjaGU9bmV3KERhLkNhY2hlfHxOYSkscn1EYS5DYWNoZT1OYTt2YXIgSWE9RGE7dmFyIHFhPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLEZhPS9cXChcXCk/L2csV2E9ZnVuY3Rpb24odCl7dmFyIGU9SWEodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShxYSwoZnVuY3Rpb24odCxyLG4saSl7ZS5wdXNoKG4/aS5yZXBsYWNlKEZhLCIkMSIpOnJ8fHQpfSkpLGV9KSk7dmFyIHphPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9LFlhPUNvP0NvLnByb3RvdHlwZTp2b2lkIDAsJGE9WWE/WWEudG9TdHJpbmc6dm9pZCAwO3ZhciBIYT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihqbyhlKSlyZXR1cm4gemEoZSx0KSsiIjtpZihGbyhlKSlyZXR1cm4gJGE/JGEuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIgSmE9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6SGEodCl9O3ZhciBHYT1mdW5jdGlvbih0LGUpe3JldHVybiBqbyh0KT90OllvKHQsZSk/W3RdOldhKEphKHQpKX07dmFyIFZhPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Rm8odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIEthPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1HYShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbVmEoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBaYT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6S2EodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59O3ZhciBYYT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fHFvKHQpJiYiW29iamVjdCBOdW1iZXJdIj09SW8odCl9O2Z1bmN0aW9uIFFhKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIHRzKHQpe3JldHVybiEoIVFhKHQpfHwiIj09PXQpfWZ1bmN0aW9uIGVzKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gcnModCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbnModCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaXModCl7cmV0dXJuISghUWEodCl8fCIiIT09dCl9ZnVuY3Rpb24gb3ModCl7cmV0dXJuISFycyh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYobnModCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhaXModCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISFlcyh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBhcygpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIXRzKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyJfX3N5c3RlbV9fIjoke3R9fWAsaT1hcygpLG89T24obiksYT1sby5wYXJzZSgiJCoiKTtyZXR1cm4gYS5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSksYS5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1aYShlLHIpO2kucmVzb2x2ZSh0KX0pKSxhLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShhKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gdHModCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIWVzKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmb3ModFswXSkpfSh0KXx8KHQ9IiQqIiksbG8ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihycyh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihycyh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYoaXModCkpcmV0dXJuJyIiJztpZihYYSh0KSlyZXR1cm5gJHt0fWA7aWYoUWEodCkpcmV0dXJuYCIke3R9ImA7bGV0IHI9YXMoKSxuPW5ldyBSbyh0LG51bGwsbnVsbCwhMSk7cmV0dXJuIG4ub24oImRhdGEiLChmdW5jdGlvbih0KXtlKz10fSkpLG4ub24oImVuZCIsKGZ1bmN0aW9uKCl7ci5yZXNvbHZlKGUpfSkpLG4ub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5yZWplY3QodCl9KSkscn0sY3JlYXRlU3RyaW5naWZ5U3RyZWFtOmZ1bmN0aW9uKHQpe2lmKCFucyh0KSYmIWVzKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5Iik7cmV0dXJuIG5ldyBSbyh0LG51bGwsbnVsbCwhMSl9fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdKc29uU3RyZWFtKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdKc29uU3RyZWFtCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(c,"base64").toString("utf8"));function y(){var d=Z();function G(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){V(l)}}var c=G(X);if(!c)return V("invalid worker"),null;function W(){c?(c.terminate(),c=void 0):V("worker has been terminated")}function u(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};c.postMessage(l)}function i(){var l=m(),Z=b(),G={mode:"call",id:Z,fun:"stringify",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(){var l=m(),Z=b(),G={mode:"call",id:Z,fun:"parse",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function p(l){var Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))}function V(l){d.emit("error",l)}return c.on("message",p),c.on("error",V),u(Array.prototype.slice.call(arguments)),d.stringify=i,d.parse=y,d.terminate=W,d}var p,V,h={stringify:(V=G(u.mark((function l(){var Z,m,b,G=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(G),m=y(),l.next=4,m.stringify.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return V.apply(this,arguments)}),parse:(p=G(u.mark((function l(){var Z,m,b,G=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(G),m=y(),l.next=4,m.parse.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return p.apply(this,arguments)})};for(var I in W=Z(),h){var a=h[I];W[I]=a}}(),W}(d.default)})),c=b((function(l,Z){l.exports=function(){function l(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function Z(Z){return function(Z){if(Array.isArray(Z))return l(Z)}(Z)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(Z)||function(Z,d){if(Z){if("string"==typeof Z)return l(Z,d);var m=Object.prototype.toString.call(Z).slice(8,-1);return"Object"===m&&Z.constructor&&(m=Z.constructor.name),"Map"===m||"Set"===m?Array.from(Z):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?l(Z,d):void 0}}(Z)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(l,Z,d,m,b,G,c){try{var X=l[G](c),W=X.value}catch(l){return void d(l)}X.done?Z(W):Promise.resolve(W).then(m,b)}function b(l){return function(){var Z=this,m=arguments;return new Promise((function(b,G){var c=l.apply(Z,m);function X(l){d(c,b,G,X,W,"next",l)}function W(l){d(c,b,G,X,W,"throw",l)}X(void 0)}))}}function G(l){return G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},G(l)}function c(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var X,W,u=c((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,b="function"==typeof Symbol?Symbol:{},c=b.iterator||"@@iterator",X=b.asyncIterator||"@@asyncIterator",W=b.toStringTag||"@@toStringTag";function u(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{u({},"")}catch(l){u=function(l,Z,d){return l[Z]=d}}function i(l,Z,d,m){var b=Z&&Z.prototype instanceof Y?Z:Y,G=Object.create(b.prototype),c=new t(m||[]);return G._invoke=function(l,Z,d){var m=p;return function(b,G){if(m===h)throw new Error("Generator is already running");if(m===I){if("throw"===b)throw G;return g()}for(d.method=b,d.arg=G;;){var c=d.delegate;if(c){var X=S(c,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===p)throw m=I,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=h;var W=y(l,Z,d);if("normal"===W.type){if(m=d.done?I:V,W.arg===a)continue;return{value:W.arg,done:d.done}}"throw"===W.type&&(m=I,d.method="throw",d.arg=W.arg)}}}(l,d,c),G}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=i;var p="suspendedStart",V="suspendedYield",h="executing",I="completed",a={};function Y(){}function R(){}function K(){}var o={};u(o,c,(function(){return this}));var L=Object.getPrototypeOf,n=L&&L(L(T([])));n&&n!==d&&m.call(n,c)&&(o=n);var J=K.prototype=Y.prototype=Object.create(o);function s(l){["next","throw","return"].forEach((function(Z){u(l,Z,(function(l){return this._invoke(Z,l)}))}))}function H(l,Z){function d(b,c,X,W){var u=y(l[b],l,c);if("throw"!==u.type){var i=u.arg,p=i.value;return p&&"object"===G(p)&&m.call(p,"__await")?Z.resolve(p.__await).then((function(l){d("next",l,X,W)}),(function(l){d("throw",l,X,W)})):Z.resolve(p).then((function(l){i.value=l,X(i)}),(function(l){return d("throw",l,X,W)}))}W(u.arg)}var b;this._invoke=function(l,m){function G(){return new Z((function(Z,b){d(l,m,Z,b)}))}return b=b?b.then(G,G):G()}}function S(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,S(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var b=y(m,l.iterator,d.arg);if("throw"===b.type)return d.method="throw",d.arg=b.arg,d.delegate=null,a;var G=b.arg;return G?G.done?(d[l.resultName]=G.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):G:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function C(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function x(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function t(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(C,this),this.reset(!0)}function T(l){if(l){var d=l[c];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var b=-1,G=function d(){for(;++b<l.length;)if(m.call(l,b))return d.value=l[b],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:g}}function g(){return{value:Z,done:!0}}return R.prototype=K,u(J,"constructor",K),u(K,"constructor",R),R.displayName=u(K,W,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===R||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,u(l,W,"GeneratorFunction")),l.prototype=Object.create(J),l},l.awrap=function(l){return{__await:l}},s(H.prototype),u(H.prototype,X,(function(){return this})),l.AsyncIterator=H,l.async=function(Z,d,m,b,G){void 0===G&&(G=Promise);var c=new H(i(Z,d,m,b),G);return l.isGeneratorFunction(d)?c:c.next().then((function(l){return l.done?l.value:c.next()}))},s(J),u(J,W,"Generator"),u(J,c,(function(){return this})),u(J,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,t.prototype={constructor:t,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(x),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function b(m,b){return X.type="throw",X.arg=l,d.next=m,b&&(d.method="next",d.arg=Z),!!b}for(var G=this.tryEntries.length-1;G>=0;--G){var c=this.tryEntries[G],X=c.completion;if("root"===c.tryLoc)return b("end");if(c.tryLoc<=this.prev){var W=m.call(c,"catchLoc"),u=m.call(c,"finallyLoc");if(W&&u){if(this.prev<c.catchLoc)return b(c.catchLoc,!0);if(this.prev<c.finallyLoc)return b(c.finallyLoc)}else if(W){if(this.prev<c.catchLoc)return b(c.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return b(c.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var b=this.tryEntries[d];if(b.tryLoc<=this.prev&&m.call(b,"finallyLoc")&&this.prev<b.finallyLoc){var G=b;break}}G&&("break"===l||"continue"===l)&&G.tryLoc<=Z&&Z<=G.finallyLoc&&(G=null);var c=G?G.completion:{};return c.type=l,c.arg=Z,G?(this.method="next",this.next=G.finallyLoc,a):this.complete(c)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),x(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var b=m.arg;x(d)}return b}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),i="function"==typeof atob,y="function"==typeof Buffer,p="function"==typeof TextDecoder?new TextDecoder:void 0,V=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),h=(X={},V.forEach((function(l,Z){return X[l]=Z})),X),I=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,a=String.fromCharCode.bind(String),Y="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(l){var Z=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(l){return l};return new Uint8Array(Array.prototype.slice.call(l,0).map(Z))},R=function(l){return l.replace(/[^A-Za-z0-9\+\/]/g,"")},K=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,o=function(l){switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return a(55296+(Z>>>10))+a(56320+(1023&Z));case 3:return a((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return a((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},L=function(l){return l.replace(K,o)},n=function(l){if(l=l.replace(/\s+/g,""),!I.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));for(var Z,d,m,b="",G=0;G<l.length;)Z=h[l.charAt(G++)]<<18|h[l.charAt(G++)]<<12|(d=h[l.charAt(G++)])<<6|(m=h[l.charAt(G++)]),b+=64===d?a(Z>>16&255):64===m?a(Z>>16&255,Z>>8&255):a(Z>>16&255,Z>>8&255,255&Z);return b},J=i?function(l){return atob(R(l))}:y?function(l){return Buffer.from(l,"base64").toString("binary")}:n,s=y?function(l){return Y(Buffer.from(l,"base64"))}:function(l){return Y(J(l),(function(l){return l.charCodeAt(0)}))},H=y?function(l){return Buffer.from(l,"base64").toString("utf8")}:p?function(l){return p.decode(s(l))}:function(l){return L(J(l))},S=function(l){return R(l.replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})))},C=function(l){return H(S(l))},x=C,t=c((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function b(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function G(l,Z,m,G,c){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new b(m,G||l,c),W=d?d+Z:Z;return l._events[W]?l._events[W].fn?l._events[W]=[l._events[W],X]:l._events[W].push(X):(l._events[W]=X,l._eventsCount++),l}function c(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,b=[];if(0===this._eventsCount)return b;for(m in l=this._events)Z.call(l,m)&&b.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?b.concat(Object.getOwnPropertySymbols(l)):b},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var b=0,G=m.length,c=new Array(G);b<G;b++)c[b]=m[b].fn;return c},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,b,G,c){var X=d?d+l:l;if(!this._events[X])return!1;var W,u,i=this._events[X],y=arguments.length;if(i.fn){switch(i.once&&this.removeListener(l,i.fn,void 0,!0),y){case 1:return i.fn.call(i.context),!0;case 2:return i.fn.call(i.context,Z),!0;case 3:return i.fn.call(i.context,Z,m),!0;case 4:return i.fn.call(i.context,Z,m,b),!0;case 5:return i.fn.call(i.context,Z,m,b,G),!0;case 6:return i.fn.call(i.context,Z,m,b,G,c),!0}for(u=1,W=new Array(y-1);u<y;u++)W[u-1]=arguments[u];i.fn.apply(i.context,W)}else{var p,V=i.length;for(u=0;u<V;u++)switch(i[u].once&&this.removeListener(l,i[u].fn,void 0,!0),y){case 1:i[u].fn.call(i[u].context);break;case 2:i[u].fn.call(i[u].context,Z);break;case 3:i[u].fn.call(i[u].context,Z,m);break;case 4:i[u].fn.call(i[u].context,Z,m,b);break;default:if(!W)for(p=1,W=new Array(y-1);p<y;p++)W[p-1]=arguments[p];i[u].fn.apply(i[u].context,W)}}return!0},X.prototype.on=function(l,Z,d){return G(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return G(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,b){var G=d?d+l:l;if(!this._events[G])return this;if(!Z)return c(this,G),this;var X=this._events[G];if(X.fn)X.fn!==Z||b&&!X.once||m&&X.context!==m||c(this,G);else{for(var W=0,u=[],i=X.length;W<i;W++)(X[W].fn!==Z||b&&!X[W].once||m&&X[W].context!==m)&&u.push(X[W]);u.length?this._events[G]=1===u.length?u[0]:u:c(this,G)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&c(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new t}function d(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,b=0;b<l;b++)Z[b]=d[0|Math.random()*m];return Z.join("")}var G=x("CgoKdmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTtmdW5jdGlvbiBlKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIG49ZSxpPXI7ZnVuY3Rpb24gbyh0KXtpZihuPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChuPT09ZXx8IW4pJiZzZXRUaW1lb3V0KXJldHVybiBuPXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gbih0LDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gbi5jYWxsKHRoaXMsdCwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldFRpbWVvdXQmJihuPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFyVGltZW91dCYmKGk9Y2xlYXJUaW1lb3V0KTt2YXIgYSxzPVtdLHU9ITEsZj0tMTtmdW5jdGlvbiBoKCl7dSYmYSYmKHU9ITEsYS5sZW5ndGg/cz1hLmNvbmNhdChzKTpmPS0xLHMubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighdSl7dmFyIHQ9byhoKTt1PSEwO2Zvcih2YXIgZT1zLmxlbmd0aDtlOyl7Zm9yKGE9cyxzPVtdOysrZjxlOylhJiZhW2ZdLnJ1bigpO2Y9LTEsZT1zLmxlbmd0aH1hPW51bGwsdT0hMSxmdW5jdGlvbih0KXtpZihpPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGk9PT1yfHwhaSkmJmNsZWFyVGltZW91dClyZXR1cm4gaT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtpKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gaS5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGkuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiBjKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07cy5wdXNoKG5ldyBkKHQsZSkpLDEhPT1zLmxlbmd0aHx8dXx8byhsKX1mdW5jdGlvbiBkKHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9ZC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gcCgpe312YXIgZz1wLHk9cCxiPXAsdj1wLHc9cCxtPXAsXz1wO3ZhciBTPXQucGVyZm9ybWFuY2V8fHt9LEU9Uy5ub3d8fFMubW96Tm93fHxTLm1zTm93fHxTLm9Ob3d8fFMud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgaz1uZXcgRGF0ZTt2YXIgUj17bmV4dFRpY2s6Yyx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOmcsYWRkTGlzdGVuZXI6eSxvbmNlOmIsb2ZmOnYscmVtb3ZlTGlzdGVuZXI6dyxyZW1vdmVBbGxMaXN0ZW5lcnM6bSxlbWl0Ol8sYmluZGluZzpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKHQpe3ZhciBlPS4wMDEqRS5jYWxsKFMpLHI9TWF0aC5mbG9vcihlKSxuPU1hdGguZmxvb3IoZSUxKjFlOSk7cmV0dXJuIHQmJihyLT10WzBdLChuLT10WzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLWspLzFlM319LGo9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBUKHQpe2lmKHQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W3JdfX0pfSkpLGV9ZnVuY3Rpb24gTyh0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c312YXIgQT1PKChmdW5jdGlvbih0KXt2b2lkIDA9PT1SfHwhUi52ZXJzaW9ufHwwPT09Ui52ZXJzaW9uLmluZGV4T2YoInYwLiIpfHwwPT09Ui52ZXJzaW9uLmluZGV4T2YoInYxLiIpJiYwIT09Ui52ZXJzaW9uLmluZGV4T2YoInYxLjguIik/dC5leHBvcnRzPXtuZXh0VGljazpmdW5jdGlvbih0LGUscixuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciY2FsbGJhY2siIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3ZhciBpLG8sYT1hcmd1bWVudHMubGVuZ3RoO3N3aXRjaChhKXtjYXNlIDA6Y2FzZSAxOnJldHVybiBSLm5leHRUaWNrKHQpO2Nhc2UgMjpyZXR1cm4gUi5uZXh0VGljaygoZnVuY3Rpb24oKXt0LmNhbGwobnVsbCxlKX0pKTtjYXNlIDM6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSxyKX0pKTtjYXNlIDQ6cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsZSxyLG4pfSkpO2RlZmF1bHQ6Zm9yKGk9bmV3IEFycmF5KGEtMSksbz0wO288aS5sZW5ndGg7KWlbbysrXT1hcmd1bWVudHNbb107cmV0dXJuIFIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5hcHBseShudWxsLGkpfSkpfX19OnQuZXhwb3J0cz1SfSkpLEM9e30udG9TdHJpbmcsTT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1DLmNhbGwodCl9O2Z1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIFAodCxlLHIpe2lmKGUpdC5jYWxsKHIpO2Vsc2UgZm9yKHZhciBuPXQubGVuZ3RoLGk9eih0LG4pLG89MDtvPG47KytvKWlbb10uY2FsbChyKX1mdW5jdGlvbiBVKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz16KHQsaSksYT0wO2E8aTsrK2Epb1thXS5jYWxsKHIsbil9ZnVuY3Rpb24gTih0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxhPXoodCxvKSxzPTA7czxvOysrcylhW3NdLmNhbGwocixuLGkpfWZ1bmN0aW9uIEQodCxlLHIsbixpLG8pe2lmKGUpdC5jYWxsKHIsbixpLG8pO2Vsc2UgZm9yKHZhciBhPXQubGVuZ3RoLHM9eih0LGEpLHU9MDt1PGE7Kyt1KXNbdV0uY2FsbChyLG4saSxvKX1mdW5jdGlvbiBJKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89eih0LGkpLGE9MDthPGk7KythKW9bYV0uYXBwbHkocixuKX1mdW5jdGlvbiBxKHQsZSxyLG4pe3ZhciBpLG8sYSxzO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoKG89dC5fZXZlbnRzKT8oby5uZXdMaXN0ZW5lciYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLGUsci5saXN0ZW5lcj9yLmxpc3RlbmVyOnIpLG89dC5fZXZlbnRzKSxhPW9bZV0pOihvPXQuX2V2ZW50cz1uZXcgeCx0Ll9ldmVudHNDb3VudD0wKSxhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYT9hPW9bZV09bj9bcixhXTpbYSxyXTpuP2EudW5zaGlmdChyKTphLnB1c2gociksIWEud2FybmVkJiYoaT1CKHQpKSYmaT4wJiZhLmxlbmd0aD5pKXthLndhcm5lZD0hMDt2YXIgdT1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrZSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTt1Lm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsdS5lbWl0dGVyPXQsdS50eXBlPWUsdS5jb3VudD1hLmxlbmd0aCxzPXUsImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUud2Fybj9jb25zb2xlLndhcm4ocyk6Y29uc29sZS5sb2cocyl9fWVsc2UgYT1vW2VdPXIsKyt0Ll9ldmVudHNDb3VudDtyZXR1cm4gdH1mdW5jdGlvbiBGKHQsZSxyKXt2YXIgbj0hMTtmdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcihlLGkpLG58fChuPSEwLHIuYXBwbHkodCxhcmd1bWVudHMpKX1yZXR1cm4gaS5saXN0ZW5lcj1yLGl9ZnVuY3Rpb24gVyh0KXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSl7dmFyIHI9ZVt0XTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gMTtpZihyKXJldHVybiByLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiB6KHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn14LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG51bGwpLEwuRXZlbnRFbWl0dGVyPUwsTC51c2luZ0RvbWFpbnM9ITEsTC5wcm90b3R5cGUuZG9tYWluPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxMLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsTC5pbml0PWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bnVsbCxMLnVzaW5nRG9tYWlucyYmdW5kZWZpbmVkLmFjdGl2ZSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPW5ldyB4LHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHxpc05hTih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibiIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxMLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLGEscyx1PSJlcnJvciI9PT10O2lmKGE9dGhpcy5fZXZlbnRzKXU9dSYmbnVsbD09YS5lcnJvcjtlbHNlIGlmKCF1KXJldHVybiExO2lmKHM9dGhpcy5kb21haW4sdSl7aWYoZT1hcmd1bWVudHNbMV0sIXMpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBmPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBmLmNvbnRleHQ9ZSxmfXJldHVybiBlfHwoZT1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50JykpLGUuZG9tYWluRW1pdHRlcj10aGlzLGUuZG9tYWluPXMsZS5kb21haW5UaHJvd249ITEscy5lbWl0KCJlcnJvciIsZSksITF9aWYoIShyPWFbdF0pKXJldHVybiExO3ZhciBoPSJmdW5jdGlvbiI9PXR5cGVvZiByO3N3aXRjaChuPWFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpQKHIsaCx0aGlzKTticmVhaztjYXNlIDI6VShyLGgsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpOKHIsaCx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDpEKHIsaCx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihpPW5ldyBBcnJheShuLTEpLG89MTtvPG47bysrKWlbby0xXT1hcmd1bWVudHNbb107SShyLGgsdGhpcyxpKX1yZXR1cm4hMH0sTC5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcSh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBxKHRoaXMsdCxlLCEwKX0sTC5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMub24odCxGKHRoaXMsdCxlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMucHJlcGVuZExpc3RlbmVyKHQsRih0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLG8sYTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCEocj1uW3RdKSlyZXR1cm4gdGhpcztpZihyPT09ZXx8ci5saXN0ZW5lciYmci5saXN0ZW5lcj09PWUpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHg6KGRlbGV0ZSBuW3RdLG4ucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsci5saXN0ZW5lcnx8ZSkpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpe2ZvcihpPS0xLG89ci5sZW5ndGg7by0tID4wOylpZihyW29dPT09ZXx8cltvXS5saXN0ZW5lciYmcltvXS5saXN0ZW5lcj09PWUpe2E9cltvXS5saXN0ZW5lcixpPW87YnJlYWt9aWYoaTwwKXJldHVybiB0aGlzO2lmKDE9PT1yLmxlbmd0aCl7aWYoclswXT12b2lkIDAsMD09LS10aGlzLl9ldmVudHNDb3VudClyZXR1cm4gdGhpcy5fZXZlbnRzPW5ldyB4LHRoaXM7ZGVsZXRlIG5bdF19ZWxzZSFmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG49cisxLGk9dC5sZW5ndGg7bjxpO3IrPTEsbis9MSl0W3JdPXRbbl07dC5wb3AoKX0ocixpKTtuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGF8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscjtpZighKHI9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighci5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2V2ZW50cz1uZXcgeCx0aGlzLl9ldmVudHNDb3VudD0wKTpyW3RdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHg6ZGVsZXRlIHJbdF0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbixpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoOysrbykicmVtb3ZlTGlzdGVuZXIiIT09KG49aVtvXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKG4pO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9bmV3IHgsdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKCJmdW5jdGlvbiI9PXR5cGVvZihlPXJbdF0pKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUpZG97dGhpcy5yZW1vdmVMaXN0ZW5lcih0LGVbZS5sZW5ndGgtMV0pfXdoaWxlKGVbMF0pO3JldHVybiB0aGlzfSxMLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9ldmVudHM7cmV0dXJuIHImJihlPXJbdF0pPyJmdW5jdGlvbiI9PXR5cGVvZiBlP1tlLmxpc3RlbmVyfHxlXTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT10W3JdLmxpc3RlbmVyfHx0W3JdO3JldHVybiBlfShlKTpbXX0sTC5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubGlzdGVuZXJDb3VudD90Lmxpc3RlbmVyQ291bnQoZSk6Vy5jYWxsKHQsZSl9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9VyxMLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W119O3ZhciBZPVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpMLEV2ZW50RW1pdHRlcjpMfSkpLCQ9WS5FdmVudEVtaXR0ZXIsSD1bXSxKPVtdLEc9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksVj0hMTtmdW5jdGlvbiBLKCl7Vj0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpSFtlXT10W2VdLEpbdC5jaGFyQ29kZUF0KGUpXT1lO0pbIi0iLmNoYXJDb2RlQXQoMCldPTYyLEpbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIFoodCxlLHIpe2Zvcih2YXIgbixpLG89W10sYT1lO2E8cjthKz0zKW49KHRbYV08PDE2KSsodFthKzFdPDw4KSt0W2ErMl0sby5wdXNoKEhbKGk9bik+PjE4JjYzXStIW2k+PjEyJjYzXStIW2k+PjYmNjNdK0hbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFgodCl7dmFyIGU7Vnx8SygpO2Zvcih2YXIgcj10Lmxlbmd0aCxuPXIlMyxpPSIiLG89W10sYT0xNjM4MyxzPTAsdT1yLW47czx1O3MrPWEpby5wdXNoKFoodCxzLHMrYT51P3U6cythKSk7cmV0dXJuIDE9PT1uPyhlPXRbci0xXSxpKz1IW2U+PjJdLGkrPUhbZTw8NCY2M10saSs9Ij09Iik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1IW2U+PjEwXSxpKz1IW2U+PjQmNjNdLGkrPUhbZTw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBRKHQsZSxyLG4saSl7dmFyIG8sYSxzPTgqaS1uLTEsdT0oMTw8cyktMSxmPXU+PjEsaD0tNyxsPXI/aS0xOjAsYz1yPy0xOjEsZD10W2UrbF07Zm9yKGwrPWMsbz1kJigxPDwtaCktMSxkPj49LWgsaCs9cztoPjA7bz0yNTYqbyt0W2UrbF0sbCs9YyxoLT04KTtmb3IoYT1vJigxPDwtaCktMSxvPj49LWgsaCs9bjtoPjA7YT0yNTYqYSt0W2UrbF0sbCs9YyxoLT04KTtpZigwPT09bylvPTEtZjtlbHNle2lmKG89PT11KXJldHVybiBhP05hTjoxLzAqKGQ/LTE6MSk7YSs9TWF0aC5wb3coMixuKSxvLT1mfXJldHVybihkPy0xOjEpKmEqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIHR0KHQsZSxyLG4saSxvKXt2YXIgYSxzLHUsZj04Km8taS0xLGg9KDE8PGYpLTEsbD1oPj4xLGM9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9aCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStsPj0xP2MvdTpjKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKGErKyx1Lz0yKSxhK2w+PWg/KHM9MCxhPWgpOmErbD49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsaSksYSs9bCk6KHM9ZSpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxhPTApKTtpPj04O3RbcitkXT0yNTUmcyxkKz1wLHMvPTI1NixpLT04KTtmb3IoYT1hPDxpfHMsZis9aTtmPjA7dFtyK2RdPTI1NSZhLGQrPXAsYS89MjU2LGYtPTgpO3RbcitkLXBdfD0xMjgqZ312YXIgZXQ9e30udG9TdHJpbmcscnQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09ZXQuY2FsbCh0KX07YXQuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgbnQ9aXQoKTtmdW5jdGlvbiBpdCgpe3JldHVybiBhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBvdCh0LGUpe2lmKGl0KCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPWF0LnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBhdChlKSksdC5sZW5ndGg9ZSksdH1mdW5jdGlvbiBhdCh0LGUscil7aWYoIShhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgYXQpKXJldHVybiBuZXcgYXQodCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZnQodGhpcyx0KX1yZXR1cm4gc3QodGhpcyx0LGUscil9ZnVuY3Rpb24gc3QodCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTthdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1hdC5wcm90b3R5cGU6dD1odCh0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFhdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8ZHQoZSxyKSxpPSh0PW90KHQsbikpLndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKGN0KGUpKXt2YXIgcj0wfGx0KGUubGVuZ3RoKTtyZXR1cm4gMD09PSh0PW90KHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj9vdCh0LDApOmh0KHQsZSk7aWYoIkJ1ZmZlciI9PT1lLnR5cGUmJnJ0KGUuZGF0YSkpcmV0dXJuIGh0KHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gdXQodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBmdCh0LGUpe2lmKHV0KGUpLHQ9b3QodCxlPDA/MDowfGx0KGUpKSwhYXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBodCh0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfGx0KGUubGVuZ3RoKTt0PW90KHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsdCh0KXtpZih0Pj1pdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitpdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBjdCh0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9ZnVuY3Rpb24gZHQodCxlKXtpZihjdCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gSXQodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBxdCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBJdCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBwdCh0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KGU+Pj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBPdCh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gUnQodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBqdCh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gVHQodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4ga3QodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gQXQodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gZ3QodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiB5dCh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9YXQuZnJvbShlLG4pKSxjdChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOmJ0KHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsYXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOmJ0KHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBidCh0LGUscixuLGkpe3ZhciBvLGE9MSxzPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTthPTIscy89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gZih0LGUpe3JldHVybiAxPT09YT90W2VdOnQucmVhZFVJbnQxNkJFKGUqYSl9aWYoaSl7dmFyIGg9LTE7Zm9yKG89cjtvPHM7bysrKWlmKGYodCxvKT09PWYoZSwtMT09PWg/MDpvLWgpKXtpZigtMT09PWgmJihoPW8pLG8taCsxPT09dSlyZXR1cm4gaCphfWVsc2UtMSE9PWgmJihvLT1vLWgpLGg9LTF9ZWxzZSBmb3Iocit1PnMmJihyPXMtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGw9ITAsYz0wO2M8dTtjKyspaWYoZih0LG8rYykhPT1mKGUsYykpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiB2dCh0LGUscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT10Lmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89ZS5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgYT0wO2E8bjsrK2Epe3ZhciBzPXBhcnNlSW50KGUuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7dFtyK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24gd3QodCxlLHIsbil7cmV0dXJuIEZ0KEl0KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIG10KHQsZSxyLG4pe3JldHVybiBGdChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIF90KHQsZSxyLG4pe3JldHVybiBtdCh0LGUscixuKX1mdW5jdGlvbiBTdCh0LGUscixuKXtyZXR1cm4gRnQocXQoZSksdCxyLG4pfWZ1bmN0aW9uIEV0KHQsZSxyLG4pe3JldHVybiBGdChmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuLGksbz1bXSxhPTA7YTx0Lmxlbmd0aCYmISgoZS09Mik8MCk7KythKW49KHI9dC5jaGFyQ29kZUF0KGEpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIGt0KHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9YKHQpOlgodC5zbGljZShlLHIpKX1mdW5jdGlvbiBSdCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLGEscyx1LGY9dFtpXSxoPW51bGwsbD1mPjIzOT80OmY+MjIzPzM6Zj4xOTE/MjoxO2lmKGkrbDw9cilzd2l0Y2gobCl7Y2FzZSAxOmY8MTI4JiYoaD1mKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmZik8PDZ8NjMmbyk+MTI3JiYoaD11KTticmVhaztjYXNlIDM6bz10W2krMV0sYT10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImYSkmJih1PSgxNSZmKTw8MTJ8KDYzJm8pPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGg9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLGE9dFtpKzJdLHM9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZmKTw8MTh8KDYzJm8pPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGg9dSl9bnVsbD09PWg/KGg9NjU1MzMsbD0xKTpoPjY1NTM1JiYoaC09NjU1MzYsbi5wdXNoKGg+Pj4xMCYxMDIzfDU1Mjk2KSxoPTU2MzIwfDEwMjMmaCksbi5wdXNoKGgpLGkrPWx9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTQwOTYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9YXQucG9vbFNpemU9ODE5MixhdC5fYXVnbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX189YXQucHJvdG90eXBlLHR9LGF0LmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBzdChudWxsLHQsZSxyKX0sYXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGF0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsYXQuX19wcm90b19fPVVpbnQ4QXJyYXkpLGF0LmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHV0KGUpLGU8PTA/b3QodCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9vdCh0LGUpLmZpbGwocixuKTpvdCh0LGUpLmZpbGwocik6b3QodCxlKX0obnVsbCx0LGUscil9LGF0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBmdChudWxsLHQpfSxhdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGZ0KG51bGwsdCl9LGF0LmlzQnVmZmVyPVd0LGF0LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighY3QodCl8fCFjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtyPXRbaV0sbj1lW2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sYXQuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYXQuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIXJ0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGF0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49YXQuYWxsb2NVbnNhZmUoZSksaT0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBvPXRbcl07aWYoIWN0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sYXQuYnl0ZUxlbmd0aD1kdCxhdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGF0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpZ3QodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LGF0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpZ3QodGhpcyxlLGUrMyksZ3QodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OClndCh0aGlzLGUsZSs3KSxndCh0aGlzLGUrMSxlKzYpLGd0KHRoaXMsZSsyLGUrNSksZ3QodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sYXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/UnQodGhpcywwLHQpOnB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PWF0LmNvbXBhcmUodGhpcyx0KX0sYXQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sYXQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCksYT0ocj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKG8sYSksdT10aGlzLnNsaWNlKG4saSksZj10LnNsaWNlKGUsciksaD0wO2g8czsrK2gpaWYodVtoXSE9PWZbaF0pe289dVtoXSxhPWZbaF07YnJlYWt9cmV0dXJuIG88YT8tMTphPG8/MTowfSxhdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxyKX0sYXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB5dCh0aGlzLHQsZSxyLCEwKX0sYXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geXQodGhpcyx0LGUsciwhMSl9LGF0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdnQodGhpcyx0LGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gd3QodGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIG10KHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIF90KHRoaXMsdCxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gU3QodGhpcyx0LGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBFdCh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxhdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTtmdW5jdGlvbiBqdCh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFR0KHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBPdCh0LGUscil7dmFyIG49dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89ZTtvPHI7KytvKWkrPUR0KHRbb10pO3JldHVybiBpfWZ1bmN0aW9uIEF0KHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQ3QodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE10KHQsZSxyLG4saSxvKXtpZighY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIHh0KHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBMdCh0LGUscixuKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsNCk7aTxvOysraSl0W3IraV09ZT4+PjgqKG4/aTozLWkpJjI1NX1mdW5jdGlvbiBCdCh0LGUscixuLGksbyl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFB0KHQsZSxyLG4saSl7cmV0dXJuIGl8fEJ0KHQsMCxyLDQpLHR0KHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFV0KHQsZSxyLG4saSl7cmV0dXJuIGl8fEJ0KHQsMCxyLDgpLHR0KHQsZSxyLG4sNTIsOCkscis4fWF0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKHQ9fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLChlPXZvaWQgMD09PWU/bjp+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksZTx0JiYoZT10KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPWF0LnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBhdChpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbyt0XX1yZXR1cm4gcn0sYXQucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sYXQucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sYXQucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LGF0LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sYXQucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxhdC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0sYXQucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LGF0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LGF0LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxDdCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxvPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbdCstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KmUpKSxvfSxhdC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7ZXx8Q3QodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sYXQucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Q3QodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sYXQucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxhdC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LGF0LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDQsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCEwLDIzLDQpfSxhdC5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Q3QodCw0LHRoaXMubGVuZ3RoKSxRKHRoaXMsdCwhMSwyMyw0KX0sYXQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxDdCh0LDgsdGhpcy5sZW5ndGgpLFEodGhpcyx0LCEwLDUyLDgpfSxhdC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEN0KHQsOCx0aGlzLmxlbmd0aCksUSh0aGlzLHQsITEsNTIsOCl9LGF0LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fE10KHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxNdCh0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSwxLDI1NSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sYXQucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6eHQodGhpcyx0LGUsITApLGUrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiw2NTUzNSwwKSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6eHQodGhpcyx0LGUsITEpLGUrMn0sYXQucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6THQodGhpcyx0LGUsITApLGUrNH0sYXQucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6THQodGhpcyx0LGUsITEpLGUrNH0sYXQucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtNdCh0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxhPTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYoYSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvLTFdJiYocz0xKSx0aGlzW2Urb109KHQvYT4+MCktcyYyNTU7cmV0dXJuIGUrcn0sYXQucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtNdCh0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89ci0xLGE9MSxzPTA7Zm9yKHRoaXNbZStvXT0yNTUmdDstLW8+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK28rMV0mJihzPTEpLHRoaXNbZStvXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDEsMTI3LC0xMjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LGF0LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8TXQodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTp4dCh0aGlzLHQsZSwhMCksZSsyfSxhdC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fE10KHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSxhdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6eHQodGhpcyx0LGUsITEpLGUrMn0sYXQucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6THQodGhpcyx0LGUsITApLGUrNH0sYXQucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxNdCh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLGF0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6THQodGhpcyx0LGUsITEpLGUrNH0sYXQucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFB0KHRoaXMsdCxlLCEwLHIpfSxhdC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUHQodGhpcyx0LGUsITEscil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVXQodGhpcyx0LGUsITAscil9LGF0LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVXQodGhpcyx0LGUsITEscil9LGF0LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxuLXImJihuPXQubGVuZ3RoLWUrcik7dmFyIGksbz1uLXI7aWYodGhpcz09PXQmJnI8ZSYmZTxuKWZvcihpPW8tMTtpPj0wOy0taSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgaWYobzwxZTN8fCFhdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sYXQucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIWF0LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI8PWUpcmV0dXJuIHRoaXM7dmFyIG87aWYoZT4+Pj0wLHI9dm9pZCAwPT09cj90aGlzLmxlbmd0aDpyPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKG89ZTtvPHI7KytvKXRoaXNbb109dDtlbHNle3ZhciBhPWN0KHQpP3Q6SXQobmV3IGF0KHQsbikudG9TdHJpbmcoKSkscz1hLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09YVtvJXNdfXJldHVybiB0aGlzfTt2YXIgTnQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gRHQodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEl0KHQsZSl7dmFyIHI7ZT1lfHwxLzA7Zm9yKHZhciBuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLGE9MDthPG47KythKXtpZigocj10LmNoYXJDb2RlQXQoYSkpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGErMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBxdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxhO1Z8fEsoKTt2YXIgcz10Lmxlbmd0aDtpZihzJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PXRbcy0yXT8yOiI9Ij09PXRbcy0xXT8xOjAsYT1uZXcgRygzKnMvNC1vKSxuPW8+MD9zLTQ6czt2YXIgdT0wO2ZvcihlPTAscj0wO2U8bjtlKz00LHIrPTMpaT1KW3QuY2hhckNvZGVBdChlKV08PDE4fEpbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxKW3QuY2hhckNvZGVBdChlKzIpXTw8NnxKW3QuY2hhckNvZGVBdChlKzMpXSxhW3UrK109aT4+MTYmMjU1LGFbdSsrXT1pPj44JjI1NSxhW3UrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPUpbdC5jaGFyQ29kZUF0KGUpXTw8MnxKW3QuY2hhckNvZGVBdChlKzEpXT4+NCxhW3UrK109MjU1JmkpOjE9PT1vJiYoaT1KW3QuY2hhckNvZGVBdChlKV08PDEwfEpbdC5jaGFyQ29kZUF0KGUrMSldPDw0fEpbdC5jaGFyQ29kZUF0KGUrMildPj4yLGFbdSsrXT1pPj44JjI1NSxhW3UrK109MjU1JmkpLGF9KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoTnQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIEZ0KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIFd0KHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8enQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmenQodC5zbGljZSgwLDApKX0odCkpfWZ1bmN0aW9uIHp0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9dmFyIFl0PVQoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQnVmZmVyOmF0LElOU1BFQ1RfTUFYX0JZVEVTOjUwLFNsb3dCdWZmZXI6ZnVuY3Rpb24odCl7cmV0dXJuK3QhPXQmJih0PTApLGF0LmFsbG9jKCt0KX0saXNCdWZmZXI6V3Qsa01heExlbmd0aDpudH0pKSwkdD1PKChmdW5jdGlvbih0LGUpe3ZhciByPVl0LkJ1ZmZlcjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdfWZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiByKHQsZSxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1ZdDoobihZdCxlKSxlLkJ1ZmZlcj1pKSxuKHIsaSksaS5mcm9tPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcih0LGUsbil9LGkuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9cih0KTtyZXR1cm4gdm9pZCAwIT09ZT8ic3RyaW5nIj09dHlwZW9mIG4/aS5maWxsKGUsbik6aS5maWxsKGUpOmkuZmlsbCgwKSxpfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIodCl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIFl0LlNsb3dCdWZmZXIodCl9fSkpO2Z1bmN0aW9uIEh0KHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9dmFyIEp0LEd0PXtpc0FycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6IltvYmplY3QgQXJyYXldIj09PUh0KHQpfSxpc0Jvb2xlYW46ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH0saXNOdWxsOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0saXNOdWxsT3JVbmRlZmluZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9LGlzTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH0saXNTdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fSxpc1N5bWJvbDpmdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9LGlzVW5kZWZpbmVkOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fSxpc1JlZ0V4cDpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PUh0KHQpfSxpc09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fSxpc0RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09SHQodCl9LGlzRXJyb3I6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PUh0KHQpfHx0IGluc3RhbmNlb2YgRXJyb3J9LGlzRnVuY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9LGlzUHJpbWl0aXZlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHwic3RyaW5nIj09dHlwZW9mIHR8fCJzeW1ib2wiPT10eXBlb2YgdHx8dm9pZCAwPT09dH0saXNCdWZmZXI6WXQuQnVmZmVyLmlzQnVmZmVyfSxWdD1PKChmdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fX0pKTtKdD0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbih0LGUpe3Quc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSl9OmZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IHIsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH07dmFyIEt0PUp0LFp0PS8lW3NkaiVdL2c7ZnVuY3Rpb24gWHQodCl7aWYoIXBlKHQpKXtmb3IodmFyIGU9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZS5wdXNoKG5lKGFyZ3VtZW50c1tyXSkpO3JldHVybiBlLmpvaW4oIiAiKX1yPTE7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPW4ubGVuZ3RoLG89U3RyaW5nKHQpLnJlcGxhY2UoWnQsKGZ1bmN0aW9uKHQpe2lmKCIlJSI9PT10KXJldHVybiIlIjtpZihyPj1pKXJldHVybiB0O3N3aXRjaCh0KXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKG5bcisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihuW3IrK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobltyKytdKX1jYXRjaCh0KXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gdH19KSksYT1uW3JdO3I8aTthPW5bKytyXSlsZShhKXx8IXZlKGEpP28rPSIgIithOm8rPSIgIituZShhKTtyZXR1cm4gb31mdW5jdGlvbiBRdChlLHIpe2lmKHllKHQucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFF0KGUscikuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PVIubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgbj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighbil7aWYoUi50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihyKTtSLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShyKTpjb25zb2xlLmVycm9yKHIpLG49ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgdGUsZWU9e307ZnVuY3Rpb24gcmUodCl7aWYoeWUodGUpJiYodGU9Ui5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFlZVt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KHRlKSl7ZWVbdF09ZnVuY3Rpb24oKXt2YXIgZT1YdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgZWVbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBlZVt0XX1mdW5jdGlvbiBuZSh0LGUpe3ZhciByPXtzZWVuOltdLHN0eWxpemU6b2V9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYoci5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLmNvbG9ycz1hcmd1bWVudHNbM10pLGhlKGUpP3Iuc2hvd0hpZGRlbj1lOmUmJkFlKHIsZSkseWUoci5zaG93SGlkZGVuKSYmKHIuc2hvd0hpZGRlbj0hMSkseWUoci5kZXB0aCkmJihyLmRlcHRoPTIpLHllKHIuY29sb3JzKSYmKHIuY29sb3JzPSExKSx5ZShyLmN1c3RvbUluc3BlY3QpJiYoci5jdXN0b21JbnNwZWN0PSEwKSxyLmNvbG9ycyYmKHIuc3R5bGl6ZT1pZSksYWUocix0LHIuZGVwdGgpfWZ1bmN0aW9uIGllKHQsZSl7dmFyIHI9bmUuc3R5bGVzW2VdO3JldHVybiByPyIbWyIrbmUuY29sb3JzW3JdWzBdKyJtIit0KyIbWyIrbmUuY29sb3JzW3JdWzFdKyJtIjp0fWZ1bmN0aW9uIG9lKHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gYWUodCxlLHIpe2lmKHQuY3VzdG9tSW5zcGVjdCYmZSYmX2UoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09bmUmJighZS5jb25zdHJ1Y3Rvcnx8ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1lKSl7dmFyIG49ZS5pbnNwZWN0KHIsdCk7cmV0dXJuIHBlKG4pfHwobj1hZSh0LG4scikpLG59dmFyIGk9ZnVuY3Rpb24odCxlKXtpZih5ZShlKSlyZXR1cm4gdC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihwZShlKSl7dmFyIHI9IiciK0pTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIHQuc3R5bGl6ZShyLCJzdHJpbmciKX1pZihkZShlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsIm51bWJlciIpO2lmKGhlKGUpKXJldHVybiB0LnN0eWxpemUoIiIrZSwiYm9vbGVhbiIpO2lmKGxlKGUpKXJldHVybiB0LnN0eWxpemUoIm51bGwiLCJudWxsIil9KHQsZSk7aWYoaSlyZXR1cm4gaTt2YXIgbz1PYmplY3Qua2V5cyhlKSxhPWZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7ZVt0XT0hMH0pKSxlfShvKTtpZih0LnNob3dIaWRkZW4mJihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSxtZShlKSYmKG8uaW5kZXhPZigibWVzc2FnZSIpPj0wfHxvLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiBzZShlKTtpZigwPT09by5sZW5ndGgpe2lmKF9lKGUpKXt2YXIgcz1lLm5hbWU/IjogIitlLm5hbWU6IiI7cmV0dXJuIHQuc3R5bGl6ZSgiW0Z1bmN0aW9uIitzKyJdIiwic3BlY2lhbCIpfWlmKGJlKGUpKXJldHVybiB0LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTtpZih3ZShlKSlyZXR1cm4gdC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksImRhdGUiKTtpZihtZShlKSlyZXR1cm4gc2UoZSl9dmFyIHUsZj0iIixoPSExLGw9WyJ7IiwifSJdOyhmZShlKSYmKGg9ITAsbD1bIlsiLCJdIl0pLF9lKGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIGJlKGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSx3ZShlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLG1lKGUpJiYoZj0iICIrc2UoZSkpLDAhPT1vLmxlbmd0aHx8aCYmMCE9ZS5sZW5ndGg/cjwwP2JlKGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLHU9aD9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxhPTAscz1lLmxlbmd0aDthPHM7KythKUNlKGUsU3RyaW5nKGEpKT9vLnB1c2godWUodCxlLHIsbixTdHJpbmcoYSksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaCh1ZSh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixhLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gdWUodCxlLHIsYSxuLGgpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7aWYodC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKT42MClyZXR1cm4gclswXSsoIiI9PT1lPyIiOmUrIlxuICIpKyIgIit0LmpvaW4oIixcbiAgIikrIiAiK3JbMV07cmV0dXJuIHJbMF0rZSsiICIrdC5qb2luKCIsICIpKyIgIityWzFdfSh1LGYsbCkpOmxbMF0rZitsWzFdfWZ1bmN0aW9uIHNlKHQpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSsiXSJ9ZnVuY3Rpb24gdWUodCxlLHIsbixpLG8pe3ZhciBhLHMsdTtpZigodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSl8fHt2YWx1ZTplW2ldfSkuZ2V0P3M9dS5zZXQ/dC5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6dC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTp1LnNldCYmKHM9dC5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksQ2UobixpKXx8KGE9IlsiK2krIl0iKSxzfHwodC5zZWVuLmluZGV4T2YodS52YWx1ZSk8MD8ocz1sZShyKT9hZSh0LHUudmFsdWUsbnVsbCk6YWUodCx1LnZhbHVlLHItMSkpLmluZGV4T2YoIlxuIik+LTEmJihzPW8/cy5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICIrdH0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK3Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAgIit0fSkpLmpvaW4oIlxuIikpOnM9dC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSx5ZShhKSl7aWYobyYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gczsoYT1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8oYT1hLnN1YnN0cigxLGEubGVuZ3RoLTIpLGE9dC5zdHlsaXplKGEsIm5hbWUiKSk6KGE9YS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIiksYT10LnN0eWxpemUoYSwic3RyaW5nIikpfXJldHVybiBhKyI6ICIrc31mdW5jdGlvbiBmZSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGxlKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gbnVsbD09dH1mdW5jdGlvbiBkZSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9ZnVuY3Rpb24gcGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIGdlKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdmUodCkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09a2UodCl9ZnVuY3Rpb24gdmUodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdmUodCkmJiJbb2JqZWN0IERhdGVdIj09PWtlKHQpfWZ1bmN0aW9uIG1lKHQpe3JldHVybiB2ZSh0KSYmKCJbb2JqZWN0IEVycm9yXSI9PT1rZSh0KXx8dCBpbnN0YW5jZW9mIEVycm9yKX1mdW5jdGlvbiBfZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBTZSh0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fHwic3ltYm9sIj09dHlwZW9mIHR8fHZvaWQgMD09PXR9ZnVuY3Rpb24gRWUodCl7cmV0dXJuIGF0LmlzQnVmZmVyKHQpfWZ1bmN0aW9uIGtlKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gUmUodCl7cmV0dXJuIHQ8MTA/IjAiK3QudG9TdHJpbmcoMTApOnQudG9TdHJpbmcoMTApfW5lLmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0sbmUuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn07dmFyIGplPVsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl07ZnVuY3Rpb24gVGUoKXt2YXIgdD1uZXcgRGF0ZSxlPVtSZSh0LmdldEhvdXJzKCkpLFJlKHQuZ2V0TWludXRlcygpKSxSZSh0LmdldFNlY29uZHMoKSldLmpvaW4oIjoiKTtyZXR1cm5bdC5nZXREYXRlKCksamVbdC5nZXRNb250aCgpXSxlXS5qb2luKCIgIil9ZnVuY3Rpb24gT2UoKXtjb25zb2xlLmxvZygiJXMgLSAlcyIsVGUoKSxYdC5hcHBseShudWxsLGFyZ3VtZW50cykpfWZ1bmN0aW9uIEFlKHQsZSl7aWYoIWV8fCF2ZShlKSlyZXR1cm4gdDtmb3IodmFyIHI9T2JqZWN0LmtleXMoZSksbj1yLmxlbmd0aDtuLS07KXRbcltuXV09ZVtyW25dXTtyZXR1cm4gdH1mdW5jdGlvbiBDZSh0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX12YXIgTWU9e2luaGVyaXRzOkt0LF9leHRlbmQ6QWUsbG9nOk9lLGlzQnVmZmVyOkVlLGlzUHJpbWl0aXZlOlNlLGlzRnVuY3Rpb246X2UsaXNFcnJvcjptZSxpc0RhdGU6d2UsaXNPYmplY3Q6dmUsaXNSZWdFeHA6YmUsaXNVbmRlZmluZWQ6eWUsaXNTeW1ib2w6Z2UsaXNTdHJpbmc6cGUsaXNOdW1iZXI6ZGUsaXNOdWxsT3JVbmRlZmluZWQ6Y2UsaXNOdWxsOmxlLGlzQm9vbGVhbjpoZSxpc0FycmF5OmZlLGluc3BlY3Q6bmUsZGVwcmVjYXRlOlF0LGZvcm1hdDpYdCxkZWJ1Z2xvZzpyZX0seGU9VChPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxmb3JtYXQ6WHQsZGVwcmVjYXRlOlF0LGRlYnVnbG9nOnJlLGluc3BlY3Q6bmUsaXNBcnJheTpmZSxpc0Jvb2xlYW46aGUsaXNOdWxsOmxlLGlzTnVsbE9yVW5kZWZpbmVkOmNlLGlzTnVtYmVyOmRlLGlzU3RyaW5nOnBlLGlzU3ltYm9sOmdlLGlzVW5kZWZpbmVkOnllLGlzUmVnRXhwOmJlLGlzT2JqZWN0OnZlLGlzRGF0ZTp3ZSxpc0Vycm9yOm1lLGlzRnVuY3Rpb246X2UsaXNQcmltaXRpdmU6U2UsaXNCdWZmZXI6RWUsbG9nOk9lLGluaGVyaXRzOkt0LF9leHRlbmQ6QWUsZGVmYXVsdDpNZX0pKSxMZT1PKChmdW5jdGlvbih0KXt2YXIgZT0kdC5CdWZmZXI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIHQucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSx0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lKSx0aGlzLmhlYWQ9ZSwrK3RoaXMubGVuZ3RofSx0LnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LHQucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiIiO2Zvcih2YXIgZT10aGlzLmhlYWQscj0iIitlLmRhdGE7ZT1lLm5leHQ7KXIrPXQrZS5kYXRhO3JldHVybiByfSx0LnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBlLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciByLG4saSxvPWUuYWxsb2NVbnNhZmUodD4+PjApLGE9dGhpcy5oZWFkLHM9MDthOylyPWEuZGF0YSxuPW8saT1zLHIuY29weShuLGkpLHMrPWEuZGF0YS5sZW5ndGgsYT1hLm5leHQ7cmV0dXJuIG99LHR9KCkseGUmJnhlLmluc3BlY3QmJnhlLmluc3BlY3QuY3VzdG9tJiYodC5leHBvcnRzLnByb3RvdHlwZVt4ZS5pbnNwZWN0LmN1c3RvbV09ZnVuY3Rpb24oKXt2YXIgdD14ZS5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIit0fSl9KSk7ZnVuY3Rpb24gQmUodCxlKXt0LmVtaXQoImVycm9yIixlKX12YXIgUGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gbnx8aT8oZT9lKHQpOiF0fHx0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8QS5uZXh0VGljayhCZSx0aGlzLHQpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveSh0fHxudWxsLChmdW5jdGlvbih0KXshZSYmdD8oQS5uZXh0VGljayhCZSxyLHQpLHIuX3dyaXRhYmxlU3RhdGUmJihyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCkpOmUmJmUodCl9KSksdGhpcyl9LFVlPWZ1bmN0aW9uKCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZz0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD0hMSksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmc9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9LE5lPWZ1bmN0aW9uKHQsZSl7aWYoRGUoIm5vRGVwcmVjYXRpb24iKSlyZXR1cm4gdDt2YXIgcj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighcil7aWYoRGUoInRocm93RGVwcmVjYXRpb24iKSl0aHJvdyBuZXcgRXJyb3IoZSk7RGUoInRyYWNlRGVwcmVjYXRpb24iKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19O2Z1bmN0aW9uIERlKHQpe3RyeXtpZighai5sb2NhbFN0b3JhZ2UpcmV0dXJuITF9Y2F0Y2godCl7cmV0dXJuITF9dmFyIGU9ai5sb2NhbFN0b3JhZ2VbdF07cmV0dXJuIG51bGwhPWUmJiJ0cnVlIj09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpfXZhciBJZT1hcixxZT1aZTtmdW5jdGlvbiBGZSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbih0LGUscil7dmFyIG49dC5lbnRyeTt0LmVudHJ5PW51bGw7Zm9yKDtuOyl7dmFyIGk9bi5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU/ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD10OmUuY29ya2VkUmVxdWVzdHNGcmVlPXR9KGUsdCl9fXZhciBXZSx6ZT0hUi5icm93c2VyJiZbInYwLjEwIiwidjAuOS4iXS5pbmRleE9mKFIudmVyc2lvbi5zbGljZSgwLDUpKT4tMT9zZXRJbW1lZGlhdGU6QS5uZXh0VGljaztaZS5Xcml0YWJsZVN0YXRlPUtlO3ZhciBZZT1PYmplY3QuY3JlYXRlKEd0KTtZZS5pbmhlcml0cz1WdDt2YXIgJGUsSGU9e2RlcHJlY2F0ZTpOZX0sSmU9JHQuQnVmZmVyLEdlPWouVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIFZlKCl7fWZ1bmN0aW9uIEtlKHQsZSl7dD10fHx7fTt2YXIgcj1lIGluc3RhbmNlb2YoV2U9V2V8fEllKTt0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciBuPXQuaGlnaFdhdGVyTWFyayxpPXQud3JpdGFibGVIaWdoV2F0ZXJNYXJrLG89dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1ufHwwPT09bj9uOnImJihpfHwwPT09aSk/aTpvLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5maW5hbENhbGxlZD0hMSx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIGE9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFhLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyPyhBLm5leHRUaWNrKGksbiksQS5uZXh0VGljayhucix0LGUpLHQuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pKTooaShuKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixuKSxucih0LGUpKX0odCxyLG4sZSxpKTtlbHNle3ZhciBvPWVyKHIpO298fHIuY29ya2VkfHxyLmJ1ZmZlclByb2Nlc3Npbmd8fCFyLmJ1ZmZlcmVkUmVxdWVzdHx8dHIodCxyKSxuP3plKFFlLHQscixvLGkpOlFlKHQscixvLGkpfX0oZSx0KX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgRmUodGhpcyl9ZnVuY3Rpb24gWmUodCl7aWYoV2U9V2V8fEllLCEoJGUuY2FsbChaZSx0aGlzKXx8dGhpcyBpbnN0YW5jZW9mIFdlKSlyZXR1cm4gbmV3IFplKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEtlKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXQuZGVzdHJveSksImZ1bmN0aW9uIj09dHlwZW9mIHQuZmluYWwmJih0aGlzLl9maW5hbD10LmZpbmFsKSksJC5jYWxsKHRoaXMpfWZ1bmN0aW9uIFhlKHQsZSxyLG4saSxvLGEpe2Uud3JpdGVsZW49bixlLndyaXRlY2I9YSxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLHI/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gUWUodCxlLHIsbil7cnx8ZnVuY3Rpb24odCxlKXswPT09ZS5sZW5ndGgmJmUubmVlZERyYWluJiYoZS5uZWVkRHJhaW49ITEsdC5lbWl0KCJkcmFpbiIpKX0odCxlKSxlLnBlbmRpbmdjYi0tLG4oKSxucih0LGUpfWZ1bmN0aW9uIHRyKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciByPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmciYmci5uZXh0KXt2YXIgbj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KG4pLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1yO2Zvcih2YXIgYT0wLHM9ITA7cjspaVthXT1yLHIuaXNCdWZ8fChzPSExKSxyPXIubmV4dCxhKz0xO2kuYWxsQnVmZmVycz1zLFhlKHQsZSwhMCxlLmxlbmd0aCxpLCIiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgRmUoZSksZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDtyOyl7dmFyIHU9ci5jaHVuayxmPXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKFhlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTp1Lmxlbmd0aCx1LGYsaCkscj1yLm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBlcih0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBycih0LGUpe3QuX2ZpbmFsKChmdW5jdGlvbihyKXtlLnBlbmRpbmdjYi0tLHImJnQuZW1pdCgiZXJyb3IiLHIpLGUucHJlZmluaXNoZWQ9ITAsdC5lbWl0KCJwcmVmaW5pc2giKSxucih0LGUpfSkpfWZ1bmN0aW9uIG5yKHQsZSl7dmFyIHI9ZXIoZSk7cmV0dXJuIHImJighZnVuY3Rpb24odCxlKXtlLnByZWZpbmlzaGVkfHxlLmZpbmFsQ2FsbGVkfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQuX2ZpbmFsPyhlLnBlbmRpbmdjYisrLGUuZmluYWxDYWxsZWQ9ITAsQS5uZXh0VGljayhycix0LGUpKTooZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKSl9KHQsZSksMD09PWUucGVuZGluZ2NiJiYoZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKSkscn1ZZS5pbmhlcml0cyhaZSwkKSxLZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoS2UucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6SGUuZGVwcmVjYXRlKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIiwiREVQMDAwMyIpfSl9Y2F0Y2godCl7fX0oKSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaGFzSW5zdGFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXT8oJGU9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFplLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISEkZS5jYWxsKHRoaXMsdCl8fHRoaXM9PT1aZSYmKHQmJnQuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBLZSl9fSkpOiRlPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpc30sWmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LFplLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZSxpPSExLG89IW4ub2JqZWN0TW9kZSYmZnVuY3Rpb24odCl7cmV0dXJuIEplLmlzQnVmZmVyKHQpfHx0IGluc3RhbmNlb2YgR2V9KHQpO3JldHVybiBvJiYhSmUuaXNCdWZmZXIodCkmJih0PWZ1bmN0aW9uKHQpe3JldHVybiBKZS5mcm9tKHQpfSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxvP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1WZSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksQS5uZXh0VGljayhlLHIpfSh0aGlzLHIpOihvfHxmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLEEubmV4dFRpY2sobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSkmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpLG8pe2lmKCFyKXt2YXIgYT1mdW5jdGlvbih0LGUscil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT1KZS5mcm9tKGUscikpO3JldHVybiBlfShlLG4saSk7biE9PWEmJihyPSEwLGk9ImJ1ZmZlciIsbj1hKX12YXIgcz1lLm9iamVjdE1vZGU/MTpuLmxlbmd0aDtlLmxlbmd0aCs9czt2YXIgdT1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7dXx8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgZj1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PXtjaHVuazpuLGVuY29kaW5nOmksaXNCdWY6cixjYWxsYmFjazpvLG5leHQ6bnVsbH0sZj9mLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgWGUodCxlLCExLHMsbixpLG8pO3JldHVybiB1fSh0aGlzLG4sbyx0LGUscikpLGl9LFplLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sWmUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHx0cih0aGlzLHQpKX0sWmUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KFplLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLFplLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LFplLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsWmUucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLG5yKHQsZSksciYmKGUuZmluaXNoZWQ/QS5uZXh0VGljayhyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoWmUucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksWmUucHJvdG90eXBlLmRlc3Ryb3k9UGUsWmUucHJvdG90eXBlLl91bmRlc3Ryb3k9VWUsWmUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5lbmQoKSxlKHQpfTt2YXIgaXI9T3Isb3I9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZX0sYXI9bHIsc3I9T2JqZWN0LmNyZWF0ZShHdCk7c3IuaW5oZXJpdHM9VnQsc3IuaW5oZXJpdHMobHIsaXIpO2Zvcih2YXIgdXI9b3IocWUucHJvdG90eXBlKSxmcj0wO2ZyPHVyLmxlbmd0aDtmcisrKXt2YXIgaHI9dXJbZnJdO2xyLnByb3RvdHlwZVtocl18fChsci5wcm90b3R5cGVbaHJdPXFlLnByb3RvdHlwZVtocl0pfWZ1bmN0aW9uIGxyKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGxyKSlyZXR1cm4gbmV3IGxyKHQpO2lyLmNhbGwodGhpcyx0KSxxZS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsY3IpfWZ1bmN0aW9uIGNyKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxBLm5leHRUaWNrKGRyLHRoaXMpfWZ1bmN0aW9uIGRyKHQpe3QuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGxyLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsci5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkKX0sc2V0OmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD10LHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLGxyLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSx0aGlzLmVuZCgpLEEubmV4dFRpY2soZSx0KX07dmFyIHByPSR0LkJ1ZmZlcixncj1wci5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2goKHQ9IiIrdCkmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTt2YXIgeXI9YnI7ZnVuY3Rpb24gYnIodCl7dmFyIGU7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuInV0ZjgiO2Zvcih2YXIgZTs7KXN3aXRjaCh0KXtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiJ1dGY4IjtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuInV0ZjE2bGUiO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuImxhdGluMSI7Y2FzZSJiYXNlNjQiOmNhc2UiYXNjaWkiOmNhc2UiaGV4IjpyZXR1cm4gdDtkZWZhdWx0OmlmKGUpcmV0dXJuO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksZT0hMH19KHQpO2lmKCJzdHJpbmciIT10eXBlb2YgZSYmKHByLmlzRW5jb2Rpbmc9PT1ncnx8IWdyKHQpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIGV8fHR9KHQpLHRoaXMuZW5jb2Rpbmcpe2Nhc2UidXRmMTZsZSI6dGhpcy50ZXh0PW1yLHRoaXMuZW5kPV9yLGU9NDticmVhaztjYXNlInV0ZjgiOnRoaXMuZmlsbExhc3Q9d3IsZT00O2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnRleHQ9U3IsdGhpcy5lbmQ9RXIsZT0zO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMud3JpdGU9a3Isdm9pZCh0aGlzLmVuZD1Scil9dGhpcy5sYXN0TmVlZD0wLHRoaXMubGFzdFRvdGFsPTAsdGhpcy5sYXN0Q2hhcj1wci5hbGxvY1Vuc2FmZShlKX1mdW5jdGlvbiB2cih0KXtyZXR1cm4gdDw9MTI3PzA6dD4+NT09Nj8yOnQ+PjQ9PTE0PzM6dD4+Mz09MzA/NDp0Pj42PT0yPy0xOi0yfWZ1bmN0aW9uIHdyKHQpe3ZhciBlPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQscj1mdW5jdGlvbih0LGUscil7aWYoMTI4IT0oMTkyJmVbMF0pKXJldHVybiB0Lmxhc3ROZWVkPTAsIu+/vSI7aWYodC5sYXN0TmVlZD4xJiZlLmxlbmd0aD4xKXtpZigxMjghPSgxOTImZVsxXSkpcmV0dXJuIHQubGFzdE5lZWQ9MSwi77+9IjtpZih0Lmxhc3ROZWVkPjImJmUubGVuZ3RoPjImJjEyOCE9KDE5MiZlWzJdKSlyZXR1cm4gdC5sYXN0TmVlZD0yLCLvv70ifX0odGhpcyx0KTtyZXR1cm4gdm9pZCAwIT09cj9yOnRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoPyh0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpKToodC5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHQubGVuZ3RoKSx2b2lkKHRoaXMubGFzdE5lZWQtPXQubGVuZ3RoKSl9ZnVuY3Rpb24gbXIodCxlKXtpZigodC5sZW5ndGgtZSklMj09MCl7dmFyIHI9dC50b1N0cmluZygidXRmMTZsZSIsZSk7aWYocil7dmFyIG49ci5jaGFyQ29kZUF0KHIubGVuZ3RoLTEpO2lmKG4+PTU1Mjk2JiZuPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSxyLnNsaWNlKDAsLTEpfXJldHVybiByfXJldHVybiB0aGlzLmxhc3ROZWVkPTEsdGhpcy5sYXN0VG90YWw9Mix0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMV0sdC50b1N0cmluZygidXRmMTZsZSIsZSx0Lmxlbmd0aC0xKX1mdW5jdGlvbiBfcih0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciByPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIGUrdGhpcy5sYXN0Q2hhci50b1N0cmluZygidXRmMTZsZSIsMCxyKX1yZXR1cm4gZX1mdW5jdGlvbiBTcih0LGUpe3ZhciByPSh0Lmxlbmd0aC1lKSUzO3JldHVybiAwPT09cj90LnRvU3RyaW5nKCJiYXNlNjQiLGUpOih0aGlzLmxhc3ROZWVkPTMtcix0aGlzLmxhc3RUb3RhbD0zLDE9PT1yP3RoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09dFt0Lmxlbmd0aC0xXSksdC50b1N0cmluZygiYmFzZTY0IixlLHQubGVuZ3RoLXIpKX1mdW5jdGlvbiBFcih0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP2UrdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwwLDMtdGhpcy5sYXN0TmVlZCk6ZX1mdW5jdGlvbiBrcih0KXtyZXR1cm4gdC50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBScih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIn1ici5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7aWYoMD09PXQubGVuZ3RoKXJldHVybiIiO3ZhciBlLHI7aWYodGhpcy5sYXN0TmVlZCl7aWYodm9pZCAwPT09KGU9dGhpcy5maWxsTGFzdCh0KSkpcmV0dXJuIiI7cj10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIHI9MDtyZXR1cm4gcjx0Lmxlbmd0aD9lP2UrdGhpcy50ZXh0KHQscik6dGhpcy50ZXh0KHQscik6ZXx8IiJ9LGJyLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lKyLvv70iOmV9LGJyLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUubGVuZ3RoLTE7aWYobjxyKXJldHVybiAwO3ZhciBpPXZyKGVbbl0pO2lmKGk+PTApcmV0dXJuIGk+MCYmKHQubGFzdE5lZWQ9aS0xKSxpO2lmKC0tbjxyfHwtMj09PWkpcmV0dXJuIDA7aWYoKGk9dnIoZVtuXSkpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMiksaTtpZigtLW48cnx8LTI9PT1pKXJldHVybiAwO2lmKChpPXZyKGVbbl0pKT49MClyZXR1cm4gaT4wJiYoMj09PWk/aT0wOnQubGFzdE5lZWQ9aS0zKSxpO3JldHVybiAwfSh0aGlzLHQsZSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIHQudG9TdHJpbmcoInV0ZjgiLGUpO3RoaXMubGFzdFRvdGFsPXI7dmFyIG49dC5sZW5ndGgtKHItdGhpcy5sYXN0TmVlZCk7cmV0dXJuIHQuY29weSh0aGlzLmxhc3RDaGFyLDAsbiksdC50b1N0cmluZygidXRmOCIsZSxuKX0sYnIucHJvdG90eXBlLmZpbGxMYXN0PWZ1bmN0aW9uKHQpe2lmKHRoaXMubGFzdE5lZWQ8PXQubGVuZ3RoKXJldHVybiB0LmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO3QuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCx0Lmxlbmd0aCksdGhpcy5sYXN0TmVlZC09dC5sZW5ndGh9O3ZhciBqcixUcj17U3RyaW5nRGVjb2Rlcjp5cn0sT3I9TnI7TnIuUmVhZGFibGVTdGF0ZT1VcixZLkV2ZW50RW1pdHRlcjt2YXIgQXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSxDcj0kdC5CdWZmZXIsTXI9ai5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIHhyPU9iamVjdC5jcmVhdGUoR3QpO3hyLmluaGVyaXRzPVZ0O3ZhciBMcixCcj12b2lkIDA7QnI9eGUmJnhlLmRlYnVnbG9nP3hlLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbigpe30seHIuaW5oZXJpdHMoTnIsJCk7dmFyIFByPVsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdO2Z1bmN0aW9uIFVyKHQsZSl7dD10fHx7fTt2YXIgcj1lIGluc3RhbmNlb2YoanI9anJ8fEllKTt0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciBuPXQuaGlnaFdhdGVyTWFyayxpPXQucmVhZGFibGVIaWdoV2F0ZXJNYXJrLG89dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1ufHwwPT09bj9uOnImJihpfHwwPT09aSk/aTpvLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5idWZmZXI9bmV3IExlLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHQuZW5jb2RpbmcmJihMcnx8KExyPVRyLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgTHIodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBOcih0KXtpZihqcj1qcnx8SWUsISh0aGlzIGluc3RhbmNlb2YgTnIpKXJldHVybiBuZXcgTnIodCk7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcgVXIodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXQuZGVzdHJveSkpLCQuY2FsbCh0aGlzKX1mdW5jdGlvbiBEcih0LGUscixuLGkpe3ZhciBvLGE9dC5fcmVhZGFibGVTdGF0ZTtudWxsPT09ZT8oYS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCxGcih0KX0odCxhKSk6KGl8fChvPWZ1bmN0aW9uKHQsZSl7dmFyIHI7KGZ1bmN0aW9uKHQpe3JldHVybiBDci5pc0J1ZmZlcih0KXx8dCBpbnN0YW5jZW9mIE1yfSkoZSl8fCJzdHJpbmciPT10eXBlb2YgZXx8dm9pZCAwPT09ZXx8dC5vYmplY3RNb2RlfHwocj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3JldHVybiByfShhLGUpKSxvP3QuZW1pdCgiZXJyb3IiLG8pOmEub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MD8oInN0cmluZyI9PXR5cGVvZiBlfHxhLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PUNyLnByb3RvdHlwZXx8KGU9ZnVuY3Rpb24odCl7cmV0dXJuIENyLmZyb20odCl9KGUpKSxuP2EuZW5kRW1pdHRlZD90LmVtaXQoImVycm9yIixuZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50IikpOklyKHQsYSxlLCEwKTphLmVuZGVkP3QuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSk6KGEucmVhZGluZz0hMSxhLmRlY29kZXImJiFyPyhlPWEuZGVjb2Rlci53cml0ZShlKSxhLm9iamVjdE1vZGV8fDAhPT1lLmxlbmd0aD9Jcih0LGEsZSwhMSk6enIodCxhKSk6SXIodCxhLGUsITEpKSk6bnx8KGEucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGEpfWZ1bmN0aW9uIElyKHQsZSxyLG4pe2UuZmxvd2luZyYmMD09PWUubGVuZ3RoJiYhZS5zeW5jPyh0LmVtaXQoImRhdGEiLHIpLHQucmVhZCgwKSk6KGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCxuP2UuYnVmZmVyLnVuc2hpZnQocik6ZS5idWZmZXIucHVzaChyKSxlLm5lZWRSZWFkYWJsZSYmRnIodCkpLHpyKHQsZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KE5yLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXQpfX0pLE5yLnByb3RvdHlwZS5kZXN0cm95PVBlLE5yLnByb3RvdHlwZS5fdW5kZXN0cm95PVVlLE5yLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSxlKHQpfSxOci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gbi5vYmplY3RNb2RlP3I9ITA6InN0cmluZyI9PXR5cGVvZiB0JiYoKGU9ZXx8bi5kZWZhdWx0RW5jb2RpbmcpIT09bi5lbmNvZGluZyYmKHQ9Q3IuZnJvbSh0LGUpLGU9IiIpLHI9ITApLERyKHRoaXMsdCxlLCExLHIpfSxOci5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gRHIodGhpcyx0LG51bGwsITAsITEpfSxOci5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sTnIucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBMcnx8KExyPVRyLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgTHIodCksdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10LHRoaXN9O2Z1bmN0aW9uIHFyKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49ODM4ODYwOD90PTgzODg2MDg6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gRnIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KEJyKCJlbWl0UmVhZGFibGUiLGUuZmxvd2luZyksZS5lbWl0dGVkUmVhZGFibGU9ITAsZS5zeW5jP0EubmV4dFRpY2soV3IsdCk6V3IodCkpfWZ1bmN0aW9uIFdyKHQpe0JyKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLEpyKHQpfWZ1bmN0aW9uIHpyKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsQS5uZXh0VGljayhZcix0LGUpKX1mdW5jdGlvbiBZcih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoQnIoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiAkcih0KXtCcigicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIEhyKHQsZSl7ZS5yZWFkaW5nfHwoQnIoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksSnIodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gSnIodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3IoQnIoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gR3IodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihhPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPUNyLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLGEpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBWcih0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLEEubmV4dFRpY2soS3IsZSx0KSl9ZnVuY3Rpb24gS3IodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIFpyKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfU5yLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe0JyKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBCcigicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/VnIodGhpcyk6RnIodGhpcyksbnVsbDtpZigwPT09KHQ9cXIodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmVnIodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBCcigibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZCcigibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9CcigicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKEJyKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PXFyKHIsZSkpKSxudWxsPT09KG49dD4wP0dyKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmVnIodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LE5yLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxOci5wcm90b3R5cGUucGlwZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChuLnBpcGVzQ291bnQpe2Nhc2UgMDpuLnBpcGVzPXQ7YnJlYWs7Y2FzZSAxOm4ucGlwZXM9W24ucGlwZXMsdF07YnJlYWs7ZGVmYXVsdDpuLnBpcGVzLnB1c2godCl9bi5waXBlc0NvdW50Kz0xLEJyKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0oIWV8fCExIT09ZS5lbmQpJiZ0IT09Ui5zdGRvdXQmJnQhPT1SLnN0ZGVycj9hOnA7ZnVuY3Rpb24gbyhlLGkpe0JyKCJvbnVucGlwZSIpLGU9PT1yJiZpJiYhMT09PWkuaGFzVW5waXBlZCYmKGkuaGFzVW5waXBlZD0hMCxCcigiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixzKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGEpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscCksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsaCksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHMoKSl9ZnVuY3Rpb24gYSgpe0JyKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP0EubmV4dFRpY2soaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtCcigicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZBcih0LCJkYXRhIikmJihlLmZsb3dpbmc9ITAsSnIodCkpfX0ocik7dC5vbigiZHJhaW4iLHMpO3ZhciB1PSExO3ZhciBmPSExO2Z1bmN0aW9uIGgoZSl7QnIoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1acihuLnBpcGVzLHQpKSYmIXUmJihCcigiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXtCcigib25lcnJvciIsZSkscCgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09QXIodCwiZXJyb3IiKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gYygpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCkscCgpfWZ1bmN0aW9uIGQoKXtCcigib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsYykscCgpfWZ1bmN0aW9uIHAoKXtCcigidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGgpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/TSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGwpLHQub25jZSgiY2xvc2UiLGMpLHQub25jZSgiZmluaXNoIixkKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KEJyKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LE5yLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPXtoYXNVbnBpcGVkOiExfTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcyxyKSksdGhpcztpZighdCl7dmFyIG49ZS5waXBlcyxpPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgbz0wO288aTtvKyspbltvXS5lbWl0KCJ1bnBpcGUiLHRoaXMscik7cmV0dXJuIHRoaXN9dmFyIGE9WnIoZS5waXBlcyx0KTtyZXR1cm4tMT09PWF8fChlLnBpcGVzLnNwbGljZShhLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcyxyKSksdGhpc30sTnIucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9JC5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQsZSk7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgbj10aGlzLl9yZWFkYWJsZVN0YXRlO24uZW5kRW1pdHRlZHx8bi5yZWFkYWJsZUxpc3RlbmluZ3x8KG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5lbWl0dGVkUmVhZGFibGU9ITEsbi5yZWFkaW5nP24ubGVuZ3RoJiZGcih0aGlzKTpBLm5leHRUaWNrKCRyLHRoaXMpKX1yZXR1cm4gcn0sTnIucHJvdG90eXBlLmFkZExpc3RlbmVyPU5yLnByb3RvdHlwZS5vbixOci5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoQnIoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsQS5uZXh0VGljayhIcix0LGUpKX0odGhpcyx0KSksdGhpc30sTnIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEJyKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihCcigicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzfSxOci5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dGhpcy5fcmVhZGFibGVTdGF0ZSxuPSExO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKEJyKCJ3cmFwcGVkIGVuZCIpLHIuZGVjb2RlciYmIXIuZW5kZWQpe3ZhciB0PXIuZGVjb2Rlci5lbmQoKTt0JiZ0Lmxlbmd0aCYmZS5wdXNoKHQpfWUucHVzaChudWxsKX0pKSx0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oaSl7KEJyKCJ3cmFwcGVkIGRhdGEiKSxyLmRlY29kZXImJihpPXIuZGVjb2Rlci53cml0ZShpKSksci5vYmplY3RNb2RlJiZudWxsPT1pKXx8KHIub2JqZWN0TW9kZXx8aSYmaS5sZW5ndGgpJiYoZS5wdXNoKGkpfHwobj0hMCx0LnBhdXNlKCkpKX0pKSx0KXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0W2ldJiYodGhpc1tpXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdFtlXS5hcHBseSh0LGFyZ3VtZW50cyl9fShpKSk7Zm9yKHZhciBvPTA7bzxQci5sZW5ndGg7bysrKXQub24oUHJbb10sdGhpcy5lbWl0LmJpbmQodGhpcyxQcltvXSkpO3JldHVybiB0aGlzLl9yZWFkPWZ1bmN0aW9uKGUpe0JyKCJ3cmFwcGVkIF9yZWFkIixlKSxuJiYobj0hMSx0LnJlc3VtZSgpKX0sdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KE5yLnByb3RvdHlwZSwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE5yLl9mcm9tTGlzdD1Hcjt2YXIgWHI9ZW4sUXI9T2JqZWN0LmNyZWF0ZShHdCk7ZnVuY3Rpb24gdG4odCxlKXt2YXIgcj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtyLnRyYW5zZm9ybWluZz0hMTt2YXIgbj1yLndyaXRlY2I7aWYoIW4pcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigid3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIikpO3Iud3JpdGVjaHVuaz1udWxsLHIud3JpdGVjYj1udWxsLG51bGwhPWUmJnRoaXMucHVzaChlKSxuKHQpO3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5yZWFkaW5nPSExLChpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIGVuKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGVuKSlyZXR1cm4gbmV3IGVuKHQpO0llLmNhbGwodGhpcyx0KSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06dG4uYmluZCh0aGlzKSxuZWVkVHJhbnNmb3JtOiExLHRyYW5zZm9ybWluZzohMSx3cml0ZWNiOm51bGwsd3JpdGVjaHVuazpudWxsLHdyaXRlZW5jb2Rpbmc6bnVsbH0sdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub24oInByZWZpbmlzaCIscm4pfWZ1bmN0aW9uIHJuKCl7dmFyIHQ9dGhpczsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKGUscil7bm4odCxlLHIpfSkpOm5uKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBubih0LGUscil7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7aWYobnVsbCE9ciYmdC5wdXNoKHIpLHQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYodC5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiB0LnB1c2gobnVsbCl9UXIuaW5oZXJpdHM9VnQsUXIuaW5oZXJpdHMoZW4sSWUpLGVuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsSWUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LGVuLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIl90cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sZW4ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYobi53cml0ZWNiPXIsbi53cml0ZWNodW5rPXQsbi53cml0ZWVuY29kaW5nPWUsIW4udHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhuLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSxlbi5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PWUud3JpdGVjaHVuayYmZS53cml0ZWNiJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9LGVuLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7SWUucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcyx0LChmdW5jdGlvbih0KXtlKHQpLHIuZW1pdCgiY2xvc2UiKX0pKX07dmFyIG9uPXNuLGFuPU9iamVjdC5jcmVhdGUoR3QpO2Z1bmN0aW9uIHNuKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHNuKSlyZXR1cm4gbmV3IHNuKHQpO1hyLmNhbGwodGhpcyx0KX1hbi5pbmhlcml0cz1WdCxhbi5pbmhlcml0cyhzbixYciksc24ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX07dmFyIHVuPU8oKGZ1bmN0aW9uKHQsZSl7KGU9dC5leHBvcnRzPWlyKS5TdHJlYW09ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1xZSxlLkR1cGxleD1JZSxlLlRyYW5zZm9ybT1YcixlLlBhc3NUaHJvdWdoPW9ufSkpLlJlYWRhYmxlLGZuPWxuO2xuLmN0b3I9Y24sbG4ub2JqPWZ1bmN0aW9uKHQsZSl7KCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTtyZXR1cm4odD1wbih0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsbG4odCxlKX07dmFyIGhuPWNuKCk7ZnVuY3Rpb24gbG4odCxlKXsoIm9iamVjdCIhPXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KTt2YXIgcixuPW5ldyBobih0KTtyZXR1cm4gbi5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhyPShyPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsLGk9ci5sZW5ndGg/ci5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYobj1pLGk9bnVsbCksZShuLGkpfSk6ZXx8ZG4sbn1mdW5jdGlvbiBjbih0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHVuLmNhbGwodGhpcyxlfHx0KTt2YXIgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9cG4odCksVnQocix1biksci5wcm90b3R5cGUuX2Zyb209ZXx8ZG4sci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmRlc3Ryb3llZCl7dGhpcy5kZXN0cm95ZWQ9ITA7dmFyIGU9dGhpcztSLm5leHRUaWNrKChmdW5jdGlvbigpe3QmJmUuZW1pdCgiZXJyb3IiLHQpLGUuZW1pdCgiY2xvc2UiKX0pKX19LHJ9ZnVuY3Rpb24gZG4oKXt9ZnVuY3Rpb24gcG4odCl7cmV0dXJuIHQ9dHx8e319dmFyIGduLHluPTEsYm49e30sdm49ITEsd249dC5kb2N1bWVudDtmdW5jdGlvbiBtbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gYm5beW5dPW4sZ24oeW4pLHluKyt9ZnVuY3Rpb24gX24odCl7aWYodm4pc2V0VGltZW91dChfbiwwLHQpO2Vsc2V7dmFyIGU9Ym5bdF07aWYoZSl7dm49ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIGJuW3RdfSh0KSx2bj0hMX19fX12YXIgU24sRW4sa24sUm4sam49T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7ZnVuY3Rpb24gVG4odCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiBPbih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFhdC5pc0J1ZmZlcih0KSkmJih0PWF0LmZyb20odCkpLGU9VG4odCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhYXQuaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3QgYT0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1hP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLGZuKChmdW5jdGlvbiBvKGEscyl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMsYSxzKX1jYXRjaCh0KXtzKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCBtbihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7bW4ocyxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe21uKHMsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgbW4ocyxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLGEpO3Q9dC5zbGljZShhKSxtbihzLG51bGwsdSl9KSl9am49am4mJmpuLnNldFRpbWVvdXQ/am46dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/Z249ZnVuY3Rpb24odCl7Ui5uZXh0VGljaygoZnVuY3Rpb24oKXtfbih0KX0pKX06IWZ1bmN0aW9uKCl7aWYodC5wb3N0TWVzc2FnZSYmIXQuaW1wb3J0U2NyaXB0cyl7dmFyIGU9ITAscj10Lm9ubWVzc2FnZTtyZXR1cm4gdC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtlPSExfSx0LnBvc3RNZXNzYWdlKCIiLCIqIiksdC5vbm1lc3NhZ2U9cixlfX0oKT90Lk1lc3NhZ2VDaGFubmVsPygoRW49bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7X24odC5kYXRhKX0sZ249ZnVuY3Rpb24odCl7RW4ucG9ydDIucG9zdE1lc3NhZ2UodCl9KTp3biYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiB3bi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8oU249d24uZG9jdW1lbnRFbGVtZW50LGduPWZ1bmN0aW9uKHQpe3ZhciBlPXduLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7X24odCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxTbi5yZW1vdmVDaGlsZChlKSxlPW51bGx9LFNuLmFwcGVuZENoaWxkKGUpfSk6Z249ZnVuY3Rpb24odCl7c2V0VGltZW91dChfbiwwLHQpfTooa249InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLFJuPWZ1bmN0aW9uKGUpe2Uuc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT1lLmRhdGEuaW5kZXhPZihrbikmJl9uKCtlLmRhdGEuc2xpY2Uoa24ubGVuZ3RoKSl9LHQuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLFJuLCExKTp0LmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLFJuKSxnbj1mdW5jdGlvbihlKXt0LnBvc3RNZXNzYWdlKGtuK2UsIioiKX0pLE9uLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1Ubih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxmbi5vYmooKGZ1bmN0aW9uIG8oYSxzKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMsYSxzKX1jYXRjaCh0KXtzKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO21uKHMsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTttbihzLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7bW4ocyx0KX19KSgpOih0aGlzLnB1c2godCksbW4ocyxudWxsLG51bGwpKX0pKX07dmFyIEFuPXt9LENuPUFuLkxFRlRfQlJBQ0U9MSxNbj1Bbi5SSUdIVF9CUkFDRT0yLHhuPUFuLkxFRlRfQlJBQ0tFVD0zLExuPUFuLlJJR0hUX0JSQUNLRVQ9NCxCbj1Bbi5DT0xPTj01LFBuPUFuLkNPTU1BPTYsVW49QW4uVFJVRT03LE5uPUFuLkZBTFNFPTgsRG49QW4uTlVMTD05LEluPUFuLlNUUklORz0xMCxxbj1Bbi5OVU1CRVI9MTEsRm49QW4uU1RBUlQ9MTcsV249QW4uU1RPUD0xOCx6bj1Bbi5UUlVFMT0zMyxZbj1Bbi5UUlVFMj0zNCwkbj1Bbi5UUlVFMz0zNSxIbj1Bbi5GQUxTRTE9NDksSm49QW4uRkFMU0UyPTUwLEduPUFuLkZBTFNFMz01MSxWbj1Bbi5GQUxTRTQ9NTIsS249QW4uTlVMTDE9NjUsWm49QW4uTlVMTDI9NjYsWG49QW4uTlVMTDM9NjcsUW49QW4uTlVNQkVSMT04MSx0aT1Bbi5OVU1CRVIzPTgzLGVpPUFuLlNUUklORzE9OTcscmk9QW4uU1RSSU5HMj05OCxuaT1Bbi5TVFJJTkczPTk5LGlpPUFuLlNUUklORzQ9MTAwLG9pPUFuLlNUUklORzU9MTAxLGFpPUFuLlNUUklORzY9MTAyLHNpPUFuLlZBTFVFPTExMyx1aT1Bbi5LRVk9MTE0LGZpPUFuLk9CSkVDVD0xMjksaGk9QW4uQVJSQVk9MTMwLGxpPSJcXCIuY2hhckNvZGVBdCgwKSxjaT0iLyIuY2hhckNvZGVBdCgwKSxkaT0iXGIiLmNoYXJDb2RlQXQoMCkscGk9IlxmIi5jaGFyQ29kZUF0KDApLGdpPSJcbiIuY2hhckNvZGVBdCgwKSx5aT0iXHIiLmNoYXJDb2RlQXQoMCksYmk9Ilx0Ii5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIHZpKCl7dGhpcy50U3RhdGU9Rm4sdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPWF0LmFsbG9jP2F0LmFsbG9jKDY1NTM2KTpuZXcgYXQoNjU1MzYpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1zaSx0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IGF0KDIpLDM6bmV3IGF0KDMpLDQ6bmV3IGF0KDQpfSx0aGlzLm9mZnNldD0tMX12aS50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKEFuKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKEFuW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIHdpPXZpLnByb3RvdHlwZTt3aS5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LHdpLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPVduLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrdmkudG9rbmFtKHRoaXMudFN0YXRlKSkpfSx3aS5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj02NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHdpLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPjY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0sd2kud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgYXQodCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PUZuKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihDbiwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4oTW4sIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4oeG4sIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oTG4sIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oQm4sIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oUG4sIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9em47ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPUhuO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1LbjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPWVpO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT1RbjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9dGk7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09ZWkpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK3ZpLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1Gbix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKEluLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9YXQuYnl0ZUxlbmd0aCh0aGlzLnN0cmluZywidXRmOCIpKzEsdGhpcy5zdHJpbmc9dm9pZCAwO2Vsc2UgaWYoOTI9PT1lKXRoaXMudFN0YXRlPXJpO2Vsc2V7aWYoIShlPj0zMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1yaSlpZigzND09PShlPXRbcl0pKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDkyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIobGkpLHRoaXMudFN0YXRlPWVpO2Vsc2UgaWYoNDc9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihjaSksdGhpcy50U3RhdGU9ZWk7ZWxzZSBpZig5OD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGRpKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDEwMj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHBpKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDExMD09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGdpKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDExND09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHlpKSx0aGlzLnRTdGF0ZT1laTtlbHNlIGlmKDExNj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGJpKSx0aGlzLnRTdGF0ZT1laTtlbHNle2lmKDExNyE9PWUpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy51bmljb2RlPSIiLHRoaXMudFN0YXRlPW5pfWVsc2UgaWYodGhpcy50U3RhdGU9PT1uaXx8dGhpcy50U3RhdGU9PT1paXx8dGhpcy50U3RhdGU9PT1vaXx8dGhpcy50U3RhdGU9PT1haSl7aWYoISgoZT10W3JdKT49NDgmJmU8NjR8fGU+NjQmJmU8PTcwfHxlPjk2JiZlPD0xMDIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO2lmKHRoaXMudW5pY29kZSs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZSsrPT09YWkpe3ZhciBhPXBhcnNlSW50KHRoaXMudW5pY29kZSwxNik7dGhpcy51bmljb2RlPXZvaWQgMCx2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJmE+PTU2MzIwJiZhPDU3MzQ0Pyh0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgYXQoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUsYSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJmE+PTU1Mjk2JiZhPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1hOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgYXQoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IGF0KFN0cmluZy5mcm9tQ2hhckNvZGUoYSkpKSksdGhpcy50U3RhdGU9ZWl9fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Rbnx8dGhpcy50U3RhdGU9PT10aSlzd2l0Y2goZT10W3JdKXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDY6Y2FzZSAxMDE6Y2FzZSA2OTpjYXNlIDQzOmNhc2UgNDU6dGhpcy5zdHJpbmcrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9dGk7YnJlYWs7ZGVmYXVsdDp0aGlzLnRTdGF0ZT1Gbjt2YXIgcz1OdW1iZXIodGhpcy5zdHJpbmcpO2lmKGlzTmFOKHMpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuc3RyaW5nLm1hdGNoKC9bMC05XSsvKT09dGhpcy5zdHJpbmcmJnMudG9TdHJpbmcoKSE9dGhpcy5zdHJpbmc/dGhpcy5vblRva2VuKEluLHRoaXMuc3RyaW5nKTp0aGlzLm9uVG9rZW4ocW4scyksdGhpcy5vZmZzZXQrPXRoaXMuc3RyaW5nLmxlbmd0aC0xLHRoaXMuc3RyaW5nPXZvaWQgMCxyLS19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXpuKXtpZigxMTQhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVlufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Zbil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT0kbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09JG4pe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9Rm4sdGhpcy5vblRva2VuKFVuLCEwKSx0aGlzLm9mZnNldCs9M31lbHNlIGlmKHRoaXMudFN0YXRlPT09SG4pe2lmKDk3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Kbn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Sm4pe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9R259ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUduKXtpZigxMTUhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVZufWVsc2UgaWYodGhpcy50U3RhdGU9PT1Wbil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gbix0aGlzLm9uVG9rZW4oTm4sITEpLHRoaXMub2Zmc2V0Kz00fWVsc2UgaWYodGhpcy50U3RhdGU9PT1Lbil7aWYoMTE3IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1abn1lbHNlIGlmKHRoaXMudFN0YXRlPT09Wm4pe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9WG59ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVhuKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZuLHRoaXMub25Ub2tlbihEbixudWxsKSx0aGlzLm9mZnNldCs9M319LHdpLm9uVG9rZW49ZnVuY3Rpb24odCxlKXt9LHdpLnBhcnNlRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Xbix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrdmkudG9rbmFtKHQpKyhlPyIoIitKU09OLnN0cmluZ2lmeShlKSsiKSI6IiIpKyIgaW4gc3RhdGUgIit2aS50b2tuYW0odGhpcy5zdGF0ZSkpKX0sd2kucHVzaD1mdW5jdGlvbigpe3RoaXMuc3RhY2sucHVzaCh7dmFsdWU6dGhpcy52YWx1ZSxrZXk6dGhpcy5rZXksbW9kZTp0aGlzLm1vZGV9KX0sd2kucG9wPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52YWx1ZSxlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy52YWx1ZT1lLnZhbHVlLHRoaXMua2V5PWUua2V5LHRoaXMubW9kZT1lLm1vZGUsdGhpcy5lbWl0KHQpLHRoaXMubW9kZXx8KHRoaXMuc3RhdGU9c2kpfSx3aS5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMubW9kZSYmKHRoaXMuc3RhdGU9UG4pLHRoaXMub25WYWx1ZSh0KX0sd2kub25WYWx1ZT1mdW5jdGlvbih0KXt9LHdpLm9uVG9rZW49ZnVuY3Rpb24odCxlKXtpZih0aGlzLnN0YXRlPT09c2kpaWYodD09PUlufHx0PT09cW58fHQ9PT1Vbnx8dD09PU5ufHx0PT09RG4pdGhpcy52YWx1ZSYmKHRoaXMudmFsdWVbdGhpcy5rZXldPWUpLHRoaXMuZW1pdChlKTtlbHNlIGlmKHQ9PT1Dbil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09e306dGhpcy52YWx1ZT17fSx0aGlzLmtleT12b2lkIDAsdGhpcy5zdGF0ZT11aSx0aGlzLm1vZGU9Zmk7ZWxzZSBpZih0PT09eG4pdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPVtdOnRoaXMudmFsdWU9W10sdGhpcy5rZXk9MCx0aGlzLm1vZGU9aGksdGhpcy5zdGF0ZT1zaTtlbHNlIGlmKHQ9PT1Nbil7aWYodGhpcy5tb2RlIT09ZmkpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZXtpZih0IT09TG4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHRoaXMubW9kZSE9PWhpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PXVpKWlmKHQ9PT1Jbil0aGlzLmtleT1lLHRoaXMuc3RhdGU9Qm47ZWxzZXtpZih0IT09TW4pcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09Qm4pe2lmKHQhPT1CbilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5zdGF0ZT1zaX1lbHNle2lmKHRoaXMuc3RhdGUhPT1QbilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodD09PVBuKXRoaXMubW9kZT09PWhpPyh0aGlzLmtleSsrLHRoaXMuc3RhdGU9c2kpOnRoaXMubW9kZT09PWZpJiYodGhpcy5zdGF0ZT11aSk7ZWxzZXtpZighKHQ9PT1MbiYmdGhpcy5tb2RlPT09aGl8fHQ9PT1NbiYmdGhpcy5tb2RlPT09ZmkpKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfX19LHZpLkM9QW47dmFyIG1pPXZpO2Z1bmN0aW9uIF9pKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1faS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LF9pLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lKSx0aGlzLmhlYWQ9ZSwrK3RoaXMubGVuZ3RofSxfaS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiAxPT09dGhpcy5sZW5ndGg/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fSxfaS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sX2kucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiIiO2Zvcih2YXIgZT10aGlzLmhlYWQscj0iIitlLmRhdGE7ZT1lLm5leHQ7KXIrPXQrZS5kYXRhO3JldHVybiByfSxfaS5wcm90b3R5cGUuY29uY2F0PWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gYXQuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9YXQuYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBTaT1hdC5pc0VuY29kaW5nfHxmdW5jdGlvbih0KXtzd2l0Y2godCYmdC50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpjYXNlInJhdyI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIEVpKHQpe3N3aXRjaCh0aGlzLmVuY29kaW5nPSh0fHwidXRmOCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sIiIpLGZ1bmN0aW9uKHQpe2lmKHQmJiFTaSh0KSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCl9KHQpLHRoaXMuZW5jb2Rpbmcpe2Nhc2UidXRmOCI6dGhpcy5zdXJyb2dhdGVTaXplPTM7YnJlYWs7Y2FzZSJ1Y3MyIjpjYXNlInV0ZjE2bGUiOnRoaXMuc3Vycm9nYXRlU2l6ZT0yLHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9Umk7YnJlYWs7Y2FzZSJiYXNlNjQiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zLHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9amk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCh0aGlzLndyaXRlPWtpKX10aGlzLmNoYXJCdWZmZXI9bmV3IGF0KDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24ga2kodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gUmkodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIGppKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1FaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LEVpLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LEVpLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSxBaS5SZWFkYWJsZVN0YXRlPU9pO3ZhciBUaT1yZSgic3RyZWFtIik7ZnVuY3Rpb24gT2kodCxlKXt0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2Ygcm8mJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQucmVhZGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5idWZmZXI9bmV3IF9pLHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMucmFuT3V0PSExLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHQuZW5jb2RpbmcmJih0aGlzLmRlY29kZXI9bmV3IEVpKHQuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyl9ZnVuY3Rpb24gQWkodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgQWkpKXJldHVybiBuZXcgQWkodCk7dGhpcy5fcmVhZGFibGVTdGF0ZT1uZXcgT2kodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJih0aGlzLl9yZWFkPXQucmVhZCksTC5jYWxsKHRoaXMpfWZ1bmN0aW9uIENpKHQsZSxyLG4saSl7dmFyIG89ZnVuY3Rpb24odCxlKXt2YXIgcj1udWxsO2F0LmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCx4aSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgcz1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIscyl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJnhpKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxjKEJpLHQsZSkpfSh0LGUpfWVsc2UgaXx8KGUucmVhZGluZz0hMSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiF0LmVuZGVkJiYodC5uZWVkUmVhZGFibGV8fHQubGVuZ3RoPHQuaGlnaFdhdGVyTWFya3x8MD09PXQubGVuZ3RoKX0oZSl9S3QoQWksTCksQWkucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLm9iamVjdE1vZGV8fCJzdHJpbmciIT10eXBlb2YgdHx8KGU9ZXx8ci5kZWZhdWx0RW5jb2RpbmcpIT09ci5lbmNvZGluZyYmKHQ9YXQuZnJvbSh0LGUpLGU9IiIpLENpKHRoaXMscix0LGUsITEpfSxBaS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gQ2kodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSxBaS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sQWkucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IEVpKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBNaSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIHhpKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChUaSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9jKExpLHQpOkxpKHQpKX1mdW5jdGlvbiBMaSh0KXtUaSgiZW1pdCByZWFkYWJsZSIpLHQuZW1pdCgicmVhZGFibGUiKSxOaSh0KX1mdW5jdGlvbiBCaSh0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aDshZS5yZWFkaW5nJiYhZS5mbG93aW5nJiYhZS5lbmRlZCYmZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrJiYoVGkoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksdC5yZWFkKDApLHIhPT1lLmxlbmd0aCk7KXI9ZS5sZW5ndGg7ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiBQaSh0KXtUaSgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksdC5yZWFkKDApfWZ1bmN0aW9uIFVpKHQsZSl7ZS5yZWFkaW5nfHwoVGkoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksTmkodCksZS5mbG93aW5nJiYhZS5yZWFkaW5nJiZ0LnJlYWQoMCl9ZnVuY3Rpb24gTmkodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtmb3IoVGkoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gRGkodCxlKXtyZXR1cm4gMD09PWUubGVuZ3RoP251bGw6KGUub2JqZWN0TW9kZT9yPWUuYnVmZmVyLnNoaWZ0KCk6IXR8fHQ+PWUubGVuZ3RoPyhyPWUuZGVjb2Rlcj9lLmJ1ZmZlci5qb2luKCIiKToxPT09ZS5idWZmZXIubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YTplLmJ1ZmZlci5jb25jYXQoZS5sZW5ndGgpLGUuYnVmZmVyLmNsZWFyKCkpOnI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuO3Q8ZS5oZWFkLmRhdGEubGVuZ3RoPyhuPWUuaGVhZC5kYXRhLnNsaWNlKDAsdCksZS5oZWFkLmRhdGE9ZS5oZWFkLmRhdGEuc2xpY2UodCkpOm49dD09PWUuaGVhZC5kYXRhLmxlbmd0aD9lLnNoaWZ0KCk6cj9mdW5jdGlvbih0LGUpe3ZhciByPWUuaGVhZCxuPTEsaT1yLmRhdGE7dC09aS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBvPXIuZGF0YSxhPXQ+by5sZW5ndGg/by5sZW5ndGg6dDtpZihhPT09by5sZW5ndGg/aSs9bzppKz1vLnNsaWNlKDAsdCksMD09PSh0LT1hKSl7YT09PW8ubGVuZ3RoPygrK24sci5uZXh0P2UuaGVhZD1yLm5leHQ6ZS5oZWFkPWUudGFpbD1udWxsKTooZS5oZWFkPXIsci5kYXRhPW8uc2xpY2UoYSkpO2JyZWFrfSsrbn1yZXR1cm4gZS5sZW5ndGgtPW4saX0odCxlKTpmdW5jdGlvbih0LGUpe3ZhciByPWF0LmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEsYT10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLGEpLDA9PT0odC09YSkpe2E9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKGEpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBJaSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLGMocWksZSx0KSl9ZnVuY3Rpb24gcWkodCxlKXt0LmVuZEVtaXR0ZWR8fDAhPT10Lmxlbmd0aHx8KHQuZW5kRW1pdHRlZD0hMCxlLnJlYWRhYmxlPSExLGUuZW1pdCgiZW5kIikpfWZ1bmN0aW9uIEZpKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIFdpKCl7fWZ1bmN0aW9uIHppKHQsZSxyKXt0aGlzLmNodW5rPXQsdGhpcy5lbmNvZGluZz1lLHRoaXMuY2FsbGJhY2s9cix0aGlzLm5leHQ9bnVsbH1mdW5jdGlvbiBZaSh0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHtnZXQ6UXQoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iKX0pLHQ9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBybyYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC53cml0YWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITE7dmFyIGk9ITE9PT10LmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFpLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49ci5zeW5jLGk9ci53cml0ZWNiO2lmKGZ1bmN0aW9uKHQpe3Qud3JpdGluZz0hMSx0LndyaXRlY2I9bnVsbCx0Lmxlbmd0aC09dC53cml0ZWxlbix0LndyaXRlbGVuPTB9KHIpLGUpIWZ1bmN0aW9uKHQsZSxyLG4saSl7LS1lLnBlbmRpbmdjYixyP2MoaSxuKTppKG4pO3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89Vmkocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxHaSh0LHIpLG4/YyhKaSx0LHIsbyxpKTpKaSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFhpKHRoaXMpfWZ1bmN0aW9uICRpKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mICRpfHx0aGlzIGluc3RhbmNlb2Ygcm8pKXJldHVybiBuZXcgJGkodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgWWkodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLEwuY2FsbCh0aGlzKX1mdW5jdGlvbiBIaSh0LGUscixuLGksbyxhKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPWEsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIEppKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCksWmkodCxlKX1mdW5jdGlvbiBHaSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIGE9MDtyOylpW2FdPXIscj1yLm5leHQsYSs9MTtIaSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFhpKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIHM9ci5jaHVuayx1PXIuZW5jb2RpbmcsZj1yLmNhbGxiYWNrO2lmKEhpKHQsZSwhMSxlLm9iamVjdE1vZGU/MTpzLmxlbmd0aCxzLHUsZikscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBLaSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIFppKHQsZSl7dmFyIHI9VmkoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KEtpKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpLaSh0LGUpKSxyfWZ1bmN0aW9uIFhpKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fUFpLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe1RpKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBUaSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/SWkodGhpcyk6eGkodGhpcyksbnVsbDtpZigwPT09KHQ9TWkodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmSWkodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBUaSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZUaSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9UaSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKFRpKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PU1pKHIsZSkpKSxudWxsPT09KG49dD4wP0RpKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmSWkodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LEFpLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0sQWkucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxUaSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/YTpmO2Z1bmN0aW9uIG8odCl7VGkoIm9udW5waXBlIiksdD09PXImJmYoKX1mdW5jdGlvbiBhKCl7VGkoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/YyhpKTpyLm9uY2UoImVuZCIsaSksdC5vbigidW5waXBlIixvKTt2YXIgcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO1RpKCJwaXBlT25EcmFpbiIsZS5hd2FpdERyYWluKSxlLmF3YWl0RHJhaW4mJmUuYXdhaXREcmFpbi0tLDA9PT1lLmF3YWl0RHJhaW4mJnQubGlzdGVuZXJzKCJkYXRhIikubGVuZ3RoJiYoZS5mbG93aW5nPSEwLE5pKHQpKX19KHIpO3Qub24oImRyYWluIixzKTt2YXIgdT0hMTtmdW5jdGlvbiBmKCl7VGkoImNsZWFudXAiKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixnKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIscyksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGQpLHQucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsbyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLHIucmVtb3ZlTGlzdGVuZXIoImRhdGEiLGwpLHU9ITAsIW4uYXdhaXREcmFpbnx8dC5fd3JpdGFibGVTdGF0ZSYmIXQuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxzKCl9dmFyIGg9ITE7ZnVuY3Rpb24gbChlKXtUaSgib25kYXRhIiksaD0hMSwhMSE9PXQud3JpdGUoZSl8fGh8fCgoMT09PW4ucGlwZXNDb3VudCYmbi5waXBlcz09PXR8fG4ucGlwZXNDb3VudD4xJiYtMSE9PUZpKG4ucGlwZXMsdCkpJiYhdSYmKFRpKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssaD0hMCksci5wYXVzZSgpKX1mdW5jdGlvbiBkKGUpe3ZhciByO1RpKCJvbmVycm9yIixlKSx5KCksdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGQpLDA9PT0ocj0iZXJyb3IiLHQubGlzdGVuZXJzKHIpLmxlbmd0aCkmJnQuZW1pdCgiZXJyb3IiLGUpfWZ1bmN0aW9uIHAoKXt0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGcpLHkoKX1mdW5jdGlvbiBnKCl7VGkoIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHkoKX1mdW5jdGlvbiB5KCl7VGkoInVucGlwZSIpLHIudW5waXBlKHQpfXJldHVybiByLm9uKCJkYXRhIixsKSxmdW5jdGlvbih0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQucHJlcGVuZExpc3RlbmVyKXJldHVybiB0LnByZXBlbmRMaXN0ZW5lcihlLHIpO3QuX2V2ZW50cyYmdC5fZXZlbnRzW2VdP0FycmF5LmlzQXJyYXkodC5fZXZlbnRzW2VdKT90Ll9ldmVudHNbZV0udW5zaGlmdChyKTp0Ll9ldmVudHNbZV09W3IsdC5fZXZlbnRzW2VdXTp0Lm9uKGUscil9KHQsImVycm9yIixkKSx0Lm9uY2UoImNsb3NlIixwKSx0Lm9uY2UoImZpbmlzaCIsZyksdC5lbWl0KCJwaXBlIixyKSxuLmZsb3dpbmd8fChUaSgicGlwZSByZXN1bWUiKSxyLnJlc3VtZSgpKSx0fSxBaS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzO2lmKCF0KXt2YXIgcj1lLnBpcGVzLG49ZS5waXBlc0NvdW50O2UucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITE7Zm9yKHZhciBpPTA7aTxuO2krKylyW2ldLmVtaXQoInVucGlwZSIsdGhpcyk7cmV0dXJuIHRoaXN9dmFyIG89RmkoZS5waXBlcyx0KTtyZXR1cm4tMT09PW98fChlLnBpcGVzLnNwbGljZShvLDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXN9LEFpLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPUwucHJvdG90eXBlLm9uLmNhbGwodGhpcyx0LGUpO2lmKCJkYXRhIj09PXQpITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCk7ZWxzZSBpZigicmVhZGFibGUiPT09dCl7dmFyIG49dGhpcy5fcmVhZGFibGVTdGF0ZTtuLmVuZEVtaXR0ZWR8fG4ucmVhZGFibGVMaXN0ZW5pbmd8fChuLnJlYWRhYmxlTGlzdGVuaW5nPW4ubmVlZFJlYWRhYmxlPSEwLG4uZW1pdHRlZFJlYWRhYmxlPSExLG4ucmVhZGluZz9uLmxlbmd0aCYmeGkodGhpcyk6YyhQaSx0aGlzKSl9cmV0dXJuIHJ9LEFpLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1BaS5wcm90b3R5cGUub24sQWkucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KFRpKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLGMoVWksdCxlKSl9KHRoaXMsdCkpLHRoaXN9LEFpLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBUaSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoVGkoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sQWkucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihUaSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhUaSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtUaSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LEFpLl9mcm9tTGlzdD1EaSwkaS5Xcml0YWJsZVN0YXRlPVlpLEt0KCRpLEwpLFlpLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LCRpLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSwkaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLGF0LmlzQnVmZmVyKHQpP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1XaSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksYyhlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTphdC5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLGMobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9YXQuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxyLG4pLGF0LmlzQnVmZmVyKHIpJiYobj0iYnVmZmVyIik7dmFyIG89ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGg7ZS5sZW5ndGgrPW87dmFyIGE9ZS5sZW5ndGg8ZS5oaWdoV2F0ZXJNYXJrO2F8fChlLm5lZWREcmFpbj0hMCk7aWYoZS53cml0aW5nfHxlLmNvcmtlZCl7dmFyIHM9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O2UubGFzdEJ1ZmZlcmVkUmVxdWVzdD1uZXcgemkocixuLGkpLHM/cy5uZXh0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDplLmJ1ZmZlcmVkUmVxdWVzdD1lLmxhc3RCdWZmZXJlZFJlcXVlc3QsZS5idWZmZXJlZFJlcXVlc3RDb3VudCs9MX1lbHNlIEhpKHQsZSwhMSxvLHIsbixpKTtyZXR1cm4gYX0odGhpcyxuLHQsZSxyKSksaX0sJGkucHJvdG90eXBlLmNvcms9ZnVuY3Rpb24oKXt0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCsrfSwkaS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fEdpKHRoaXMsdCkpfSwkaS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKCh0KyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9dCx0aGlzfSwkaS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXtyKG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIikpfSwkaS5wcm90b3R5cGUuX3dyaXRldj1udWxsLCRpLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsZT1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLG51bGwhPXQmJnRoaXMud3JpdGUodCxlKSxuLmNvcmtlZCYmKG4uY29ya2VkPTEsdGhpcy51bmNvcmsoKSksbi5lbmRpbmd8fG4uZmluaXNoZWR8fGZ1bmN0aW9uKHQsZSxyKXtlLmVuZGluZz0hMCxaaSh0LGUpLHImJihlLmZpbmlzaGVkP2Mocik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0sS3Qocm8sQWkpO2Zvcih2YXIgUWk9T2JqZWN0LmtleXMoJGkucHJvdG90eXBlKSx0bz0wO3RvPFFpLmxlbmd0aDt0bysrKXt2YXIgZW89UWlbdG9dO3JvLnByb3RvdHlwZVtlb118fChyby5wcm90b3R5cGVbZW9dPSRpLnByb3RvdHlwZVtlb10pfWZ1bmN0aW9uIHJvKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHJvKSlyZXR1cm4gbmV3IHJvKHQpO0FpLmNhbGwodGhpcyx0KSwkaS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsbm8pfWZ1bmN0aW9uIG5vKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxjKGlvLHRoaXMpfWZ1bmN0aW9uIGlvKHQpe3QuZW5kKCl9ZnVuY3Rpb24gb28odCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBhbyh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBhbykpcmV0dXJuIG5ldyBhbyh0KTtyby5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IG9vKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpe3NvKGUsdCl9KSk6c28oZSl9KSl9ZnVuY3Rpb24gc28odCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIHVvKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHVvKSlyZXR1cm4gbmV3IHVvKHQpO2FvLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBmbygpe0wuY2FsbCh0aGlzKX1mdW5jdGlvbiBobyh0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLGE9ITEscz1uZXcgZm87ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFzLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gcy5lbWl0KCJlbmQiKTtzLmVtaXQoImRhdGEiLHQpfX1mdW5jdGlvbiBmKCl7cy53cml0YWJsZT0hMSxlLmNhbGwocyksIXMucmVhZGFibGUmJnMuYXV0b0Rlc3Ryb3kmJnMuZGVzdHJveSgpfXJldHVybiBzLnJlYWRhYmxlPXMud3JpdGFibGU9ITAscy5wYXVzZWQ9ITEscy5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSkscy53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIXMucGF1c2VkfSxzLnF1ZXVlPXMucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gYXx8KG51bGw9PT10JiYoYT0hMCksby5wdXNoKHQpLHUoKSksc30scy5vbigiZW5kIiwoZnVuY3Rpb24oKXtzLnJlYWRhYmxlPSExLCFzLndyaXRhYmxlJiZzLmF1dG9EZXN0cm95JiZSLm5leHRUaWNrKChmdW5jdGlvbigpe3MuZGVzdHJveSgpfSkpfSkpLHMuZW5kPWZ1bmN0aW9uKHQpe2lmKCFuKXJldHVybiBuPSEwLGFyZ3VtZW50cy5sZW5ndGgmJnMud3JpdGUodCksZigpLHN9LHMuZGVzdHJveT1mdW5jdGlvbigpe2lmKCFpKXJldHVybiBpPSEwLG49ITAsby5sZW5ndGg9MCxzLndyaXRhYmxlPXMucmVhZGFibGU9ITEscy5lbWl0KCJjbG9zZSIpLHN9LHMucGF1c2U9ZnVuY3Rpb24oKXtpZighcy5wYXVzZWQpcmV0dXJuIHMucGF1c2VkPSEwLHN9LHMucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHMucGF1c2VkJiYocy5wYXVzZWQ9ITEscy5lbWl0KCJyZXN1bWUiKSksdSgpLHMucGF1c2VkfHxzLmVtaXQoImRyYWluIiksc30sc31LdChhbyxybyksYW8ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxyby5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sYW8ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LGFvLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sYW8ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSxLdCh1byxhbyksdW8ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0sS3QoZm8sTCksZm8uUmVhZGFibGU9QWksZm8uV3JpdGFibGU9JGksZm8uRHVwbGV4PXJvLGZvLlRyYW5zZm9ybT1hbyxmby5QYXNzVGhyb3VnaD11byxmby5TdHJlYW09Zm8sZm8ucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO2Z1bmN0aW9uIG4oZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZyLnBhdXNlJiZyLnBhdXNlKCl9ZnVuY3Rpb24gaSgpe3IucmVhZGFibGUmJnIucmVzdW1lJiZyLnJlc3VtZSgpfXIub24oImRhdGEiLG4pLHQub24oImRyYWluIixpKSx0Ll9pc1N0ZGlvfHxlJiYhMT09PWUuZW5kfHwoci5vbigiZW5kIixhKSxyLm9uKCJjbG9zZSIscykpO3ZhciBvPSExO2Z1bmN0aW9uIGEoKXtvfHwobz0hMCx0LmVuZCgpKX1mdW5jdGlvbiBzKCl7b3x8KG89ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIHUodCl7aWYoZigpLDA9PT1MLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsaSksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxyLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscyksci5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLHUpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLHIucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIHIub24oImVycm9yIix1KSx0Lm9uKCJlcnJvciIsdSksci5vbigiZW5kIixmKSxyLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsciksdH0saG8udGhyb3VnaD1obztsZXQgbG89e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBtaSxhPWhvKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PWF0LmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmYS53cml0ZSh0KSxyJiZhLmVtaXQoImhlYWRlciIsciksbiYmYS5lbWl0KCJmb290ZXIiLG4pLGEucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gcyh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChhLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGY9ITEsaD0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgcyhlLmtleSxuKTtmPSEhci5lbWl0S2V5LGg9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9cyhlLmtleSxuKSx1Kyt9fX1pZihyJiYoYS5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGw9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksYz1uO251bGwhPWMmJm51bGwhPShjPWU/ZShjLGwpOmMpJiYoKGZ8fGgpJiYoYz17dmFsdWU6Y30sZiYmKGMua2V5PXRoaXMua2V5KSxoJiYoYy5wYXRoPWwpKSxhLnF1ZXVlKGMpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmYS5yb290JiYodHx8YS5xdWV1ZShhLnJvb3QpLGEucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIiksYS5lbWl0KCJlcnJvciIsdCl9LGF9fSxjbz1mdW5jdGlvbih0LGUpe3JldHVybiBjbz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sY28odCxlKX07bGV0IHBvLGdvPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyx5bz17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9wby5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/cG8uUmVhZGFibGVPYmplY3Q6cG8uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9wby5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/cG8uT2JqZWN0OnBvLlByaW1pdGl2ZTpwby5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KHBvfHwocG89e30pKTtsZXQgdm89W107dm9bcG8uQXJyYXldPSJbIix2b1twby5PYmplY3RdPSJ7Iix2b1twby5SZWFkYWJsZVN0cmluZ109JyInLHZvW3BvLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IHdvPVtdO3dvW3BvLkFycmF5XT0iXSIsd29bcG8uT2JqZWN0XT0ifSIsd29bcG8uUmVhZGFibGVTdHJpbmddPSciJyx3b1twby5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBtbz1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKHBvKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKG1vW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiBfbyh0KXtyZXR1cm4gdC5yZXBsYWNlKGdvLChmdW5jdGlvbih0KXtsZXQgZT15b1t0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiBTbyh0KXtyZXR1cm4nIicrX28odCkrJyInfWZ1bmN0aW9uIEVvKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIGtvKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBibyh0KT09PXBvLlByb21pc2U/a28odCk6dH0pKX1sZXQgUm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgYT10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PWEmJiJudW1iZXIiIT09YXx8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Y28odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6U28odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8sYT10aGlzLHM9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihzPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLHMsdGhpcykpLHMmJnMudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihzPXMudG9KU09OKCkpLChzIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihzPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwocz12b2lkIDApKTtsZXQgdT1ibyhzKTtpZigobiYmbi50eXBlPT09cG8uQXJyYXl8fHZvaWQgMCE9PXMpJiZ1IT09cG8uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1zJiZ1IT09cG8uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK19vKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJytfbyhlKSsnIjonKSksdSE9PXBvLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKXM9dGhpcy5jeWNsZXIoZXx8cixzKSx1PWJvKHMpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhzKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6cyxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQocyl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgZj12b1t1XTtmJiZ0aGlzLl9wdXNoKGYpO2xldCBoPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTpzLGZpcnN0OiEwfTtyZXR1cm4gdT09PXBvLk9iamVjdD8odGhpcy5kZXB0aCs9MSxoLnVucmVhZD1PYmplY3Qua2V5cyhzKSxoLmlzRW1wdHk9IWgudW5yZWFkLmxlbmd0aCk6dT09PXBvLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGgudW5yZWFkPXMubGVuZ3RoLGguYXJyYXlMZW5ndGg9aC51bnJlYWQsaC5pc0VtcHR5PSFoLnVucmVhZCk6dSE9PXBvLlJlYWRhYmxlU3RyaW5nJiZ1IT09cG8uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLHMucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1zLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxzLGV8fHIpOihzLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1zLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihzLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxzLGV8fHIpKSxoLnJlYWRDb3VudD0wLHMub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtoLmVuZD0hMCxhLl9fcmVhZCgpfSkpLHMub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXthLmVycm9yPSEwLGEuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoaCksaH0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1wby5PYmplY3R8fGU9PT1wby5BcnJheXx8ZT09PXBvLlJlYWRhYmxlU3RyaW5nfHxlPT09cG8uUmVhZGFibGVPYmplY3Q7ZSE9PXBvLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj13b1tlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIEVvKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT1Tbyh0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1wby5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09cG8uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBFbyh0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2goX28odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIGtvKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbbW9bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT9tbigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfShBaSk7dmFyIGpvPUFycmF5LmlzQXJyYXksVG89Im9iamVjdCI9PXR5cGVvZiBqJiZqJiZqLk9iamVjdD09PU9iamVjdCYmaixPbz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLEFvPVRvfHxPb3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxDbz1Bby5TeW1ib2wsTW89T2JqZWN0LnByb3RvdHlwZSx4bz1Nby5oYXNPd25Qcm9wZXJ0eSxMbz1Nby50b1N0cmluZyxCbz1Dbz9Dby50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIFBvPWZ1bmN0aW9uKHQpe3ZhciBlPXhvLmNhbGwodCxCbykscj10W0JvXTt0cnl7dFtCb109dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgaT1Mby5jYWxsKHQpO3JldHVybiBuJiYoZT90W0JvXT1yOmRlbGV0ZSB0W0JvXSksaX0sVW89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgTm89ZnVuY3Rpb24odCl7cmV0dXJuIFVvLmNhbGwodCl9LERvPUNvP0NvLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgSW89ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6RG8mJkRvIGluIE9iamVjdCh0KT9Qbyh0KTpObyh0KX07dmFyIHFvPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBGbz1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fHFvKHQpJiYiW29iamVjdCBTeW1ib2xdIj09SW8odCl9LFdvPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHpvPS9eXHcqJC87dmFyIFlvPWZ1bmN0aW9uKHQsZSl7aWYoam8odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIUZvKHQpKXx8KHpvLnRlc3QodCl8fCFXby50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciAkbz1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyIEhvLEpvPWZ1bmN0aW9uKHQpe2lmKCEkbyh0KSlyZXR1cm4hMTt2YXIgZT1Jbyh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEdvPUFvWyJfX2NvcmUtanNfc2hhcmVkX18iXSxWbz0oSG89L1teLl0rJC8uZXhlYyhHbyYmR28ua2V5cyYmR28ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK0hvOiIiO3ZhciBLbz1mdW5jdGlvbih0KXtyZXR1cm4hIVZvJiZWbyBpbiB0fSxabz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFhvPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gWm8uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LFFvPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLHRhPUZ1bmN0aW9uLnByb3RvdHlwZSxlYT1PYmplY3QucHJvdG90eXBlLHJhPXRhLnRvU3RyaW5nLG5hPWVhLmhhc093blByb3BlcnR5LGlhPVJlZ0V4cCgiXiIrcmEuY2FsbChuYSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIG9hPWZ1bmN0aW9uKHQpe3JldHVybiEoISRvKHQpfHxLbyh0KSkmJihKbyh0KT9pYTpRbykudGVzdChYbyh0KSl9O3ZhciBhYT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgc2E9ZnVuY3Rpb24odCxlKXt2YXIgcj1hYSh0LGUpO3JldHVybiBvYShyKT9yOnZvaWQgMH0sdWE9c2EoT2JqZWN0LCJjcmVhdGUiKTt2YXIgZmE9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXVhP3VhKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgaGE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGxhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGNhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYodWEpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gbGEuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxkYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiB1YT92b2lkIDAhPT1lW3RdOmRhLmNhbGwoZSx0KX07dmFyIGdhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT11YSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiB5YSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX15YS5wcm90b3R5cGUuY2xlYXI9ZmEseWEucHJvdG90eXBlLmRlbGV0ZT1oYSx5YS5wcm90b3R5cGUuZ2V0PWNhLHlhLnByb3RvdHlwZS5oYXM9cGEseWEucHJvdG90eXBlLnNldD1nYTt2YXIgYmE9eWE7dmFyIHZhPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIHdhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgbWE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZih3YSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSxfYT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBTYT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bWEoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6X2EuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgRWE9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1hKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX07dmFyIGthPWZ1bmN0aW9uKHQpe3JldHVybiBtYSh0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIgUmE9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49bWEocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gamEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19amEucHJvdG90eXBlLmNsZWFyPXZhLGphLnByb3RvdHlwZS5kZWxldGU9U2EsamEucHJvdG90eXBlLmdldD1FYSxqYS5wcm90b3R5cGUuaGFzPWthLGphLnByb3RvdHlwZS5zZXQ9UmE7dmFyIFRhPWphLE9hPXNhKEFvLCJNYXAiKTt2YXIgQWE9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBiYSxtYXA6bmV3KE9hfHxUYSksc3RyaW5nOm5ldyBiYX19O3ZhciBDYT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgTWE9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiBDYShlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgeGE9ZnVuY3Rpb24odCl7dmFyIGU9TWEodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIExhPWZ1bmN0aW9uKHQpe3JldHVybiBNYSh0aGlzLHQpLmdldCh0KX07dmFyIEJhPWZ1bmN0aW9uKHQpe3JldHVybiBNYSh0aGlzLHQpLmhhcyh0KX07dmFyIFBhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWEodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24gVWEodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19VWEucHJvdG90eXBlLmNsZWFyPUFhLFVhLnByb3RvdHlwZS5kZWxldGU9eGEsVWEucHJvdG90eXBlLmdldD1MYSxVYS5wcm90b3R5cGUuaGFzPUJhLFVhLnByb3RvdHlwZS5zZXQ9UGE7dmFyIE5hPVVhO2Z1bmN0aW9uIERhKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgYT10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxhKXx8byxhfTtyZXR1cm4gci5jYWNoZT1uZXcoRGEuQ2FjaGV8fE5hKSxyfURhLkNhY2hlPU5hO3ZhciBJYT1EYTt2YXIgcWE9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csRmE9L1xcKFxcKT8vZyxXYT1mdW5jdGlvbih0KXt2YXIgZT1JYSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHFhLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoRmEsIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgemE9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0sWWE9Q28/Q28ucHJvdG90eXBlOnZvaWQgMCwkYT1ZYT9ZYS50b1N0cmluZzp2b2lkIDA7dmFyIEhhPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKGpvKGUpKXJldHVybiB6YShlLHQpKyIiO2lmKEZvKGUpKXJldHVybiAkYT8kYS5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9O3ZhciBKYT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjpIYSh0KX07dmFyIEdhPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGpvKHQpP3Q6WW8odCxlKT9bdF06V2EoSmEodCkpfTt2YXIgVmE9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxGbyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgS2E9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPUdhKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtWYShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIFphPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpLYSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn07dmFyIFhhPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8cW8odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Jbyh0KX07ZnVuY3Rpb24gUWEodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gdHModCl7cmV0dXJuISghUWEodCl8fCIiPT09dCl9ZnVuY3Rpb24gZXModCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBycyh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBucyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBpcyh0KXtyZXR1cm4hKCFRYSh0KXx8IiIhPT10KX1mdW5jdGlvbiBvcyh0KXtyZXR1cm4hIXJzKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihucyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFpcyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIWVzKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIGFzKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZighdHModCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7Il9fc3lzdGVtX18iOiR7dH19YCxpPWFzKCksbz1PbihuKSxhPWxvLnBhcnNlKCIkKiIpO3JldHVybiBhLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxhLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PVphKGUscik7aS5yZXNvbHZlKHQpfSkpLGEub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKGEpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiB0cyh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghZXModCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZvcyh0WzBdKSl9KHQpfHwodD0iJCoiKSxsby5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKHJzKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKHJzKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihpcyh0KSlyZXR1cm4nIiInO2lmKFhhKHQpKXJldHVybmAke3R9YDtpZihRYSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj1hcygpLG49bmV3IFJvKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIW5zKHQpJiYhZXModCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IFJvKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function c(){var Z=l();function b(l){try{var Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){p(l)}}var c=b(G);if(!c)return p("invalid worker"),null;function X(){c?(c.terminate(),c=void 0):p("worker has been terminated")}function W(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};c.postMessage(l)}function u(){var l=d(),b=m(),G={mode:"call",id:b,fun:"stringify",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),Z.once(b,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function i(){var l=d(),b=m(),G={mode:"call",id:b,fun:"parse",input:Array.prototype.slice.call(arguments)};return c.postMessage(G),Z.once(b,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(l){var d=l,m=d.mode;"emit"!==m&&"return"!==m||("emit"===m&&Z.emit(d.evName,d.msg),"return"===m&&Z.emit(d.id,d))}function p(l){Z.emit("error",l)}return c.onmessage=function(l){y(l.data)},c.onerror=p,W(Array.prototype.slice.call(arguments)),Z.stringify=u,Z.parse=i,Z.terminate=X,Z}var X,i,y={stringify:(i=b(u.mark((function l(){var d,m,b,G=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(G),m=c(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return i.apply(this,arguments)}),parse:(X=b(u.mark((function l(){var d,m,b,G=arguments;return u.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(G),m=c(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return b=l.sent,l.abrupt("return",b);case 6:case"end":return l.stop()}}),l)}))),function(){return X.apply(this,arguments)})};for(var p in W=l(),y){var V=y[p];W[p]=V}}(),W}()}));return"undefined"!=typeof window&&void 0!==window.document?c:G}));
1
+ !function(l,Z){"object"==typeof exports&&"undefined"!=typeof module?module.exports=Z(require("worker_threads")):"function"==typeof define&&define.amd?define(["worker_threads"],Z):(l="undefined"!=typeof globalThis?globalThis:l||self)["w-json-stream"]=Z(l.worker_threads)}(this,(function(l){"use strict";function Z(l){return l&&"object"==typeof l&&"default"in l?l:{default:l}}var d=Z(l);function m(l){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(l){return typeof l}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l},m(l)}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function c(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var b=c((function(l,Z){l.exports=function(l){function Z(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function d(l){return function(l){if(Array.isArray(l))return Z(l)}(l)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(l)||function(l,d){if(l){if("string"==typeof l)return Z(l,d);var m=Object.prototype.toString.call(l).slice(8,-1);return"Object"===m&&l.constructor&&(m=l.constructor.name),"Map"===m||"Set"===m?Array.from(l):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?Z(l,d):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(l,Z,d,m,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function b(l){return function(){var Z=this,d=arguments;return new Promise((function(m,b){var G=l.apply(Z,d);function X(l){c(G,m,b,X,i,"next",l)}function i(l){c(G,m,b,X,i,"throw",l)}X(void 0)}))}}function G(l){return G="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},G(l)}function X(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var i,W=X((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},b=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),b}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,b,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,b)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,b,X,i){var W=y(l[c],l,b);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===G(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,H(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.arg;return b?b.done?(d[l.resultName]=b.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):b:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function S(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[b];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,G=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return G.next=G}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,b,(function(){return this})),W(s,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,x.prototype={constructor:x,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var c=m.arg;C(d)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":G(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u=X((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,u=this._events[X],y=arguments.length;if(u.fn){switch(u.once&&this.removeListener(l,u.fn,void 0,!0),y){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,Z),!0;case 3:return u.fn.call(u.context,Z,m),!0;case 4:return u.fn.call(u.context,Z,m,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}return!0},X.prototype.on=function(l,Z,d){return b(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return b(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("nodejs"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function Z(){return new u}function m(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function c(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var G,X=(G="CgogICAgICAgIGxldCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykKICAgICAgICAKCmZ1bmN0aW9uIHQoKXt9ZnVuY3Rpb24gZSgpe2UuaW5pdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9lLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIG4odCxlLHIpe2lmKGUpdC5jYWxsKHIpO2Vsc2UgZm9yKHZhciBuPXQubGVuZ3RoLGk9Yyh0LG4pLG89MDtvPG47KytvKWlbb10uY2FsbChyKX1mdW5jdGlvbiBpKHQsZSxyLG4pe2lmKGUpdC5jYWxsKHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5jYWxsKHIsbil9ZnVuY3Rpb24gbyh0LGUscixuLGkpe2lmKGUpdC5jYWxsKHIsbixpKTtlbHNlIGZvcih2YXIgbz10Lmxlbmd0aCxzPWModCxvKSxhPTA7YTxvOysrYSlzW2FdLmNhbGwocixuLGkpfWZ1bmN0aW9uIHModCxlLHIsbixpLG8pe2lmKGUpdC5jYWxsKHIsbixpLG8pO2Vsc2UgZm9yKHZhciBzPXQubGVuZ3RoLGE9Yyh0LHMpLHU9MDt1PHM7Kyt1KWFbdV0uY2FsbChyLG4saSxvKX1mdW5jdGlvbiBhKHQsZSxyLG4pe2lmKGUpdC5hcHBseShyLG4pO2Vsc2UgZm9yKHZhciBpPXQubGVuZ3RoLG89Yyh0LGkpLHM9MDtzPGk7KytzKW9bc10uYXBwbHkocixuKX1mdW5jdGlvbiB1KGUsbixpLG8pe3ZhciBzLGEsdSxoO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoKGE9ZS5fZXZlbnRzKT8oYS5uZXdMaXN0ZW5lciYmKGUuZW1pdCgibmV3TGlzdGVuZXIiLG4saS5saXN0ZW5lcj9pLmxpc3RlbmVyOmkpLGE9ZS5fZXZlbnRzKSx1PWFbbl0pOihhPWUuX2V2ZW50cz1uZXcgdCxlLl9ldmVudHNDb3VudD0wKSx1KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdT91PWFbbl09bz9baSx1XTpbdSxpXTpvP3UudW5zaGlmdChpKTp1LnB1c2goaSksIXUud2FybmVkJiYocz1yKGUpKSYmcz4wJiZ1Lmxlbmd0aD5zKXt1Lndhcm5lZD0hMDt2YXIgZj1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIit1Lmxlbmd0aCsiICIrbisiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtmLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZi5lbWl0dGVyPWUsZi50eXBlPW4sZi5jb3VudD11Lmxlbmd0aCxoPWYsImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUud2Fybj9jb25zb2xlLndhcm4oaCk6Y29uc29sZS5sb2coaCl9fWVsc2UgdT1hW25dPWksKytlLl9ldmVudHNDb3VudDtyZXR1cm4gZX1mdW5jdGlvbiBoKHQsZSxyKXt2YXIgbj0hMTtmdW5jdGlvbiBpKCl7dC5yZW1vdmVMaXN0ZW5lcihlLGkpLG58fChuPSEwLHIuYXBwbHkodCxhcmd1bWVudHMpKX1yZXR1cm4gaS5saXN0ZW5lcj1yLGl9ZnVuY3Rpb24gZih0KXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSl7dmFyIHI9ZVt0XTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcilyZXR1cm4gMTtpZihyKXJldHVybiByLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG51bGwpLGUuRXZlbnRFbWl0dGVyPWUsZS51c2luZ0RvbWFpbnM9ITEsZS5wcm90b3R5cGUuZG9tYWluPXZvaWQgMCxlLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxlLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxlLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsZS5pbml0PWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bnVsbCxlLnVzaW5nRG9tYWlucyYmdW5kZWZpbmVkLmFjdGl2ZSx0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sZS5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHxpc05hTih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibiIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxlLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzKX0sZS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaCxmLGMsbCxwPSJlcnJvciI9PT10O2lmKGM9dGhpcy5fZXZlbnRzKXA9cCYmbnVsbD09Yy5lcnJvcjtlbHNlIGlmKCFwKXJldHVybiExO2lmKGw9dGhpcy5kb21haW4scCl7aWYoZT1hcmd1bWVudHNbMV0sIWwpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBlO3ZhciBkPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQuICgnK2UrIikiKTt0aHJvdyBkLmNvbnRleHQ9ZSxkfXJldHVybiBlfHwoZT1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50JykpLGUuZG9tYWluRW1pdHRlcj10aGlzLGUuZG9tYWluPWwsZS5kb21haW5UaHJvd249ITEsbC5lbWl0KCJlcnJvciIsZSksITF9aWYoIShyPWNbdF0pKXJldHVybiExO3ZhciBnPSJmdW5jdGlvbiI9PXR5cGVvZiByO3N3aXRjaCh1PWFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpuKHIsZyx0aGlzKTticmVhaztjYXNlIDI6aShyLGcsdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpvKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2Nhc2UgNDpzKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0sYXJndW1lbnRzWzNdKTticmVhaztkZWZhdWx0OmZvcihoPW5ldyBBcnJheSh1LTEpLGY9MTtmPHU7ZisrKWhbZi0xXT1hcmd1bWVudHNbZl07YShyLGcsdGhpcyxoKX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0aGlzLHQsZSwhMSl9LGUucHJvdG90eXBlLm9uPWUucHJvdG90eXBlLmFkZExpc3RlbmVyLGUucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCEwKX0sZS5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMub24odCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7cmV0dXJuIHRoaXMucHJlcGVuZExpc3RlbmVyKHQsaCh0aGlzLHQsZSkpLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUscil7dmFyIG4saSxvLHMsYTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO2lmKCEoaT10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCEobj1pW2VdKSlyZXR1cm4gdGhpcztpZihuPT09cnx8bi5saXN0ZW5lciYmbi5saXN0ZW5lcj09PXIpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6KGRlbGV0ZSBpW2VdLGkucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsbi5saXN0ZW5lcnx8cikpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pe2ZvcihvPS0xLHM9bi5sZW5ndGg7cy0tID4wOylpZihuW3NdPT09cnx8bltzXS5saXN0ZW5lciYmbltzXS5saXN0ZW5lcj09PXIpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO2lmKDE9PT1uLmxlbmd0aCl7aWYoblswXT12b2lkIDAsMD09LS10aGlzLl9ldmVudHNDb3VudClyZXR1cm4gdGhpcy5fZXZlbnRzPW5ldyB0LHRoaXM7ZGVsZXRlIGlbZV19ZWxzZSFmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG49cisxLGk9dC5sZW5ndGg7bjxpO3IrPTEsbis9MSl0W3JdPXRbbl07dC5wb3AoKX0obixvKTtpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLGF8fHIpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHIsbjtpZighKG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZighbi5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9bmV3IHQ6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgaSxvPU9iamVjdC5rZXlzKG4pLHM9MDtzPG8ubGVuZ3RoOysrcykicmVtb3ZlTGlzdGVuZXIiIT09KGk9b1tzXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGkpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKCJmdW5jdGlvbiI9PXR5cGVvZihyPW5bZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxyKTtlbHNlIGlmKHIpZG97dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHJbci5sZW5ndGgtMV0pfXdoaWxlKHJbMF0pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscj10aGlzLl9ldmVudHM7cmV0dXJuIHImJihlPXJbdF0pPyJmdW5jdGlvbiI9PXR5cGVvZiBlP1tlLmxpc3RlbmVyfHxlXTpmdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT10W3JdLmxpc3RlbmVyfHx0W3JdO3JldHVybiBlfShlKTpbXX0sZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubGlzdGVuZXJDb3VudD90Lmxpc3RlbmVyQ291bnQoZSk6Zi5jYWxsKHQsZSl9LGUucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9ZixlLnByb3RvdHlwZS5ldmVudE5hbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/UmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cyk6W119O3ZhciBsPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30scD1bXSxkPVtdLGc9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXkseT0hMTtmdW5jdGlvbiB2KCl7eT0hMDtmb3IodmFyIHQ9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpcFtlXT10W2VdLGRbdC5jaGFyQ29kZUF0KGUpXT1lO2RbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGRbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIGIodCxlLHIpe2Zvcih2YXIgbixpLG89W10scz1lO3M8cjtzKz0zKW49KHRbc108PDE2KSsodFtzKzFdPDw4KSt0W3MrMl0sby5wdXNoKHBbKGk9bik+PjE4JjYzXStwW2k+PjEyJjYzXStwW2k+PjYmNjNdK3BbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIG0odCl7dmFyIGU7eXx8digpO2Zvcih2YXIgcj10Lmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKGIodCxhLGErcz51P3U6YStzKSk7cmV0dXJuIDE9PT1uPyhlPXRbci0xXSxpKz1wW2U+PjJdLGkrPXBbZTw8NCY2M10saSs9Ij09Iik6Mj09PW4mJihlPSh0W3ItMl08PDgpK3Rbci0xXSxpKz1wW2U+PjEwXSxpKz1wW2U+PjQmNjNdLGkrPXBbZTw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiB3KHQsZSxyLG4saSl7dmFyIG8scyxhPTgqaS1uLTEsdT0oMTw8YSktMSxoPXU+PjEsZj0tNyxjPXI/aS0xOjAsbD1yPy0xOjEscD10W2UrY107Zm9yKGMrPWwsbz1wJigxPDwtZiktMSxwPj49LWYsZis9YTtmPjA7bz0yNTYqbyt0W2UrY10sYys9bCxmLT04KTtmb3Iocz1vJigxPDwtZiktMSxvPj49LWYsZis9bjtmPjA7cz0yNTYqcyt0W2UrY10sYys9bCxmLT04KTtpZigwPT09bylvPTEtaDtlbHNle2lmKG89PT11KXJldHVybiBzP05hTjoxLzAqKHA/LTE6MSk7cys9TWF0aC5wb3coMixuKSxvLT1ofXJldHVybihwPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIF8odCxlLHIsbixpLG8pe3ZhciBzLGEsdSxoPTgqby1pLTEsZj0oMTw8aCktMSxjPWY+PjEsbD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLHA9bj8wOm8tMSxkPW4/MTotMSxnPWU8MHx8MD09PWUmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8oYT1pc05hTihlKT8xOjAscz1mKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKih1PU1hdGgucG93KDIsLXMpKTwxJiYocy0tLHUqPTIpLChlKz1zK2M+PTE/bC91OmwqTWF0aC5wb3coMiwxLWMpKSp1Pj0yJiYocysrLHUvPTIpLHMrYz49Zj8oYT0wLHM9Zik6cytjPj0xPyhhPShlKnUtMSkqTWF0aC5wb3coMixpKSxzKz1jKTooYT1lKk1hdGgucG93KDIsYy0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7dFtyK3BdPTI1NSZhLHArPWQsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSxoKz1pO2g+MDt0W3IrcF09MjU1JnMscCs9ZCxzLz0yNTYsaC09OCk7dFtyK3AtZF18PTEyOCpnfXZhciBTPXt9LnRvU3RyaW5nLEU9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09Uy5jYWxsKHQpfTtmdW5jdGlvbiBrKCl7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gUih0LGUpe2lmKGsoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBBKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIEEodCxlLHIpe2lmKCEoQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgQSkpcmV0dXJuIG5ldyBBKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGoodGhpcyx0KX1yZXR1cm4gVCh0aGlzLHQsZSxyKX1mdW5jdGlvbiBUKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxyLG4pe2lmKGUuYnl0ZUxlbmd0aCxyPDB8fGUuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSxyKTpuZXcgVWludDhBcnJheShlLHIsbik7QS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTp0PUwodCxlKTtyZXR1cm4gdH0odCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighQS5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8TShlLHIpLGk9KHQ9Uih0LG4pKS53cml0ZShlLHIpO2khPT1uJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUscik6ZnVuY3Rpb24odCxlKXtpZihQKGUpKXt2YXIgcj0wfEMoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9Uih0LHIpKS5sZW5ndGh8fGUuY29weSh0LDAsMCxyKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwobj1lLmxlbmd0aCkhPW4/Uih0LDApOkwodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmRShlLmRhdGEpKXJldHVybiBMKHQsZS5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gTyh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGoodCxlKXtpZihPKGUpLHQ9Uih0LGU8MD8wOjB8QyhlKSksIUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPGU7KytyKXRbcl09MDtyZXR1cm4gdH1mdW5jdGlvbiBMKHQsZSl7dmFyIHI9ZS5sZW5ndGg8MD8wOjB8QyhlLmxlbmd0aCk7dD1SKHQscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpdFtuXT0yNTUmZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQpe2lmKHQ+PWsoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraygpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBQKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX1mdW5jdGlvbiBNKHQsZSl7aWYoUCh0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gb3QodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBzdCh0KS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBvdCh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBCKHQsZSxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEgodGhpcyxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuICQodGhpcyxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBHKHRoaXMsZSxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBKKHRoaXMsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIFcodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gVih0aGlzLGUscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiB4KHQsZSxyKXt2YXIgbj10W2VdO3RbZV09dFtyXSx0W3JdPW59ZnVuY3Rpb24gVSh0LGUscixuLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9QS5mcm9tKGUsbikpLFAoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpJKHQsZSxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsQS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUscik6SSh0LFtlXSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gSSh0LGUscixuLGkpe3ZhciBvLHM9MSxhPXQubGVuZ3RoLHU9ZS5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiAxPT09cz90W2VdOnQucmVhZFVJbnQxNkJFKGUqcyl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGgodCxvKT09PWgoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09dSlyZXR1cm4gZipzfWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGM9ITAsbD0wO2w8dTtsKyspaWYoaCh0LG8rbCkhPT1oKGUsbCkpe2M9ITE7YnJlYWt9aWYoYylyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBEKHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQoZS5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gczt0W3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBOKHQsZSxyLG4pe3JldHVybiBhdChvdChlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBGKHQsZSxyLG4pe3JldHVybiBhdChmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIHoodCxlLHIsbil7cmV0dXJuIEYodCxlLHIsbil9ZnVuY3Rpb24gcSh0LGUscixuKXtyZXR1cm4gYXQoc3QoZSksdCxyLG4pfWZ1bmN0aW9uIFkodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Mpbj0ocj10LmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gVyh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/bSh0KTptKHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gJCh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBvLHMsYSx1LGg9dFtpXSxmPW51bGwsYz1oPjIzOT80Omg+MjIzPzM6aD4xOTE/MjoxO2lmKGkrYzw9cilzd2l0Y2goYyl7Y2FzZSAxOmg8MTI4JiYoZj1oKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPXRbaSsxXSkpJiYodT0oMzEmaCk8PDZ8NjMmbyk+MTI3JiYoZj11KTticmVhaztjYXNlIDM6bz10W2krMV0scz10W2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJih1PSgxNSZoKTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGY9dSk7YnJlYWs7Y2FzZSA0Om89dFtpKzFdLHM9dFtpKzJdLGE9dFtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZoKTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJnU8MTExNDExMiYmKGY9dSl9bnVsbD09PWY/KGY9NjU1MzMsYz0xKTpmPjY1NTM1JiYoZi09NjU1MzYsbi5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfDEwMjMmZiksbi5wdXNoKGYpLGkrPWN9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTQwOTYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciByPSIiLG49MDtmb3IoO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9QS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PWwuVFlQRURfQVJSQVlfU1VQUE9SVHx8bC5UWVBFRF9BUlJBWV9TVVBQT1JULEEucG9vbFNpemU9ODE5MixBLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1BLnByb3RvdHlwZSx0fSxBLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBUKG51bGwsdCxlLHIpfSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihBLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsQS5fX3Byb3RvX189VWludDhBcnJheSksQS5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBPKGUpLGU8PTA/Uih0LGUpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP1IodCxlKS5maWxsKHIsbik6Uih0LGUpLmZpbGwocik6Uih0LGUpfShudWxsLHQsZSxyKX0sQS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gaihudWxsLHQpfSxBLmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYoISF0Ll9pc0J1ZmZlcnx8dXQodCl8fGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmdXQodC5zbGljZSgwLDApKX0odCkpfSxBLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighUCh0KXx8IVAoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LEEuaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sQS5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighRSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49QS5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIG89dFtyXTtpZighUChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LEEuYnl0ZUxlbmd0aD1NLEEucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxBLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTIpeCh0aGlzLGUsZSsxKTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz00KXgodGhpcyxlLGUrMykseCh0aGlzLGUrMSxlKzIpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpeCh0aGlzLGUsZSs3KSx4KHRoaXMsZSsxLGUrNikseCh0aGlzLGUrMixlKzUpLHgodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sQS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD8kKHRoaXMsMCx0KTpCLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1BLmNvbXBhcmUodGhpcyx0KX0sQS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSxBLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZlPj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0oZT4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksaD10LnNsaWNlKGUsciksZj0wO2Y8YTsrK2YpaWYodVtmXSE9PWhbZl0pe289dVtmXSxzPWhbZl07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxBLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxBLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSxyLCEwKX0sQS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITEpfSxBLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gRCh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBOKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBGKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHoodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBxKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gWSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxBLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIEcodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBKKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBIKHQsZSxyKXt2YXIgbj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz1lO288cjsrK28paSs9aXQodFtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVih0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEsodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFoodCxlLHIsbixpLG8pe2lmKCFQKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPml8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBRKHQsZSxyLG4pe2U8MCYmKGU9NjU1MzUrZSsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKHQubGVuZ3RoLXIsMik7aTxvOysraSl0W3IraV09KGUmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBYKHQsZSxyLG4pe2U8MCYmKGU9NDI5NDk2NzI5NStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciw0KTtpPG87KytpKXRbcitpXT1lPj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHR0KHQsZSxyLG4saSxvKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZXQodCxlLHIsbixpKXtyZXR1cm4gaXx8dHQodCwwLHIsNCksXyh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBydCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw4KSxfKHQsZSxyLG4sNTIsOCkscis4fUEucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksKGU9dm9pZCAwPT09ZT9uOn5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSxlPHQmJihlPXQpLEEuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1BLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtyPW5ldyBBKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK3RdfXJldHVybiByfSxBLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LEEucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sQS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sQS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LEEucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspbis9dGhpc1t0K29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxBLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPWUsaT0xLG89dGhpc1t0Ky0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LEEucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sQS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8Syh0LDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxBLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxBLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxBLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksdyh0aGlzLHQsITAsMjMsNCl9LEEucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSwyMyw0KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCw1Miw4KX0sQS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw4LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMSw1Miw4KX0sQS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7KHQ9K3QsZXw9MCxyfD0wLG4pfHxaKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0aGlzW2Urb109dC9pJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMjU1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LEEucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDY1NTM1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2Urby0xXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtaKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKHMqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L3M+PjApLWEmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDEsMTI3LC0xMjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOlEodGhpcyx0LGUsITApLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOlEodGhpcyx0LGUsITEpLGUrMn0sQS5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6WCh0aGlzLHQsZSwhMCksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpYKHRoaXMsdCxlLCExKSxlKzR9LEEucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBldCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHJ0KHRoaXMsdCxlLCEwLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITEscil9LEEucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09dCYmcjxlJiZlPG4pZm9yKGk9by0xO2k+PTA7LS1pKXRbaStlXT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IUEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpdFtpK2VdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShyLHIrbyksZSk7cmV0dXJuIG99LEEucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIGk9dC5jaGFyQ29kZUF0KDApO2k8MjU2JiYodD1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIUEuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9ZSlyZXR1cm4gdGhpczt2YXIgbztpZihlPj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3Iobz1lO288cjsrK28pdGhpc1tvXT10O2Vsc2V7dmFyIHM9UCh0KT90Om90KG5ldyBBKHQsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci1lOysrbyl0aGlzW28rZV09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgbnQ9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIG90KHQsZSl7dmFyIHI7ZT1lfHwxLzA7Zm9yKHZhciBuPXQubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPG47KytzKXtpZigocj10LmNoYXJDb2RlQXQocykpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBzdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGUscixuLGksbyxzO3l8fHYoKTt2YXIgYT10Lmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PXRbYS0yXT8yOiI9Ij09PXRbYS0xXT8xOjAscz1uZXcgZygzKmEvNC1vKSxuPW8+MD9hLTQ6YTt2YXIgdT0wO2ZvcihlPTAscj0wO2U8bjtlKz00LHIrPTMpaT1kW3QuY2hhckNvZGVBdChlKV08PDE4fGRbdC5jaGFyQ29kZUF0KGUrMSldPDwxMnxkW3QuY2hhckNvZGVBdChlKzIpXTw8NnxkW3QuY2hhckNvZGVBdChlKzMpXSxzW3UrK109aT4+MTYmMjU1LHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MnxkW3QuY2hhckNvZGVBdChlKzEpXT4+NCxzW3UrK109MjU1JmkpOjE9PT1vJiYoaT1kW3QuY2hhckNvZGVBdChlKV08PDEwfGRbdC5jaGFyQ29kZUF0KGUrMSldPDw0fGRbdC5jaGFyQ29kZUF0KGUrMildPj4yLHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1JmkpLHN9KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UobnQsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIGF0KHQsZSxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PWUubGVuZ3RofHxpPj10Lmxlbmd0aCk7KytpKWVbaStyXT10W2ldO3JldHVybiBpfWZ1bmN0aW9uIHV0KHQpe3JldHVybiEhdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCl9ZnVuY3Rpb24gaHQoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBmdCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIGN0PWh0LGx0PWZ0O2Z1bmN0aW9uIHB0KHQpe2lmKGN0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dCh0LDApO2lmKChjdD09PWh0fHwhY3QpJiZzZXRUaW1lb3V0KXJldHVybiBjdD1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGN0KHQsMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBjdC5jYWxsKG51bGwsdCwwKX1jYXRjaChlKXtyZXR1cm4gY3QuY2FsbCh0aGlzLHQsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgbC5zZXRUaW1lb3V0JiYoY3Q9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIGwuY2xlYXJUaW1lb3V0JiYobHQ9Y2xlYXJUaW1lb3V0KTt2YXIgZHQsZ3Q9W10seXQ9ITEsdnQ9LTE7ZnVuY3Rpb24gYnQoKXt5dCYmZHQmJih5dD0hMSxkdC5sZW5ndGg/Z3Q9ZHQuY29uY2F0KGd0KTp2dD0tMSxndC5sZW5ndGgmJm10KCkpfWZ1bmN0aW9uIG10KCl7aWYoIXl0KXt2YXIgdD1wdChidCk7eXQ9ITA7Zm9yKHZhciBlPWd0Lmxlbmd0aDtlOyl7Zm9yKGR0PWd0LGd0PVtdOysrdnQ8ZTspZHQmJmR0W3Z0XS5ydW4oKTt2dD0tMSxlPWd0Lmxlbmd0aH1kdD1udWxsLHl0PSExLGZ1bmN0aW9uKHQpe2lmKGx0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKGx0PT09ZnR8fCFsdCkmJmNsZWFyVGltZW91dClyZXR1cm4gbHQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dCh0KTt0cnl7bHQodCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBsdC5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGx0LmNhbGwodGhpcyx0KX19fSh0KX19ZnVuY3Rpb24gd3QodCl7dmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspZVtyLTFdPWFyZ3VtZW50c1tyXTtndC5wdXNoKG5ldyBfdCh0LGUpKSwxIT09Z3QubGVuZ3RofHx5dHx8cHQobXQpfWZ1bmN0aW9uIF90KHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9X3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIFN0KCl7fXZhciBFdD1TdCxrdD1TdCxSdD1TdCxBdD1TdCxUdD1TdCxPdD1TdCxqdD1TdDt2YXIgTHQ9bC5wZXJmb3JtYW5jZXx8e30sQ3Q9THQubm93fHxMdC5tb3pOb3d8fEx0Lm1zTm93fHxMdC5vTm93fHxMdC53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBQdD1uZXcgRGF0ZTt2YXIgTXQsQnQ9e25leHRUaWNrOnd0LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246RXQsYWRkTGlzdGVuZXI6a3Qsb25jZTpSdCxvZmY6QXQscmVtb3ZlTGlzdGVuZXI6VHQscmVtb3ZlQWxsTGlzdGVuZXJzOk90LGVtaXQ6anQsYmluZGluZzpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKHQpe3ZhciBlPS4wMDEqQ3QuY2FsbChMdCkscj1NYXRoLmZsb29yKGUpLG49TWF0aC5mbG9vcihlJTEqMWU5KTtyZXR1cm4gdCYmKHItPXRbMF0sKG4tPXRbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtUHQpLzFlM319O010PSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTt2YXIgeHQ9TXQsVXQ9LyVbc2RqJV0vZztmdW5jdGlvbiBJdCh0KXtpZighVnQodCkpe2Zvcih2YXIgZT1bXSxyPTA7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllLnB1c2goenQoYXJndW1lbnRzW3JdKSk7cmV0dXJuIGUuam9pbigiICIpfXI9MTtmb3IodmFyIG49YXJndW1lbnRzLGk9bi5sZW5ndGgsbz1TdHJpbmcodCkucmVwbGFjZShVdCwoZnVuY3Rpb24odCl7aWYoIiUlIj09PXQpcmV0dXJuIiUiO2lmKHI+PWkpcmV0dXJuIHQ7c3dpdGNoKHQpe2Nhc2UiJXMiOnJldHVybiBTdHJpbmcobltyKytdKTtjYXNlIiVkIjpyZXR1cm4gTnVtYmVyKG5bcisrXSk7Y2FzZSIlaiI6dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShuW3IrK10pfWNhdGNoKHQpe3JldHVybiJbQ2lyY3VsYXJdIn1kZWZhdWx0OnJldHVybiB0fX0pKSxzPW5bcl07cjxpO3M9blsrK3JdKUh0KHMpfHwhUXQocyk/bys9IiAiK3M6bys9IiAiK3p0KHMpO3JldHVybiBvfWZ1bmN0aW9uIER0KHQsZSl7aWYoS3QobC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRHQodCxlKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKCEwPT09QnQubm9EZXByZWNhdGlvbilyZXR1cm4gdDt2YXIgcj0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighcil7aWYoQnQudGhyb3dEZXByZWNhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7QnQudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUuZXJyb3IoZSkscj0hMH1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fXZhciBOdCxGdD17fTtmdW5jdGlvbiB6dCh0LGUpe3ZhciByPXtzZWVuOltdLHN0eWxpemU6WXR9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYoci5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLmNvbG9ycz1hcmd1bWVudHNbM10pLEp0KGUpP3Iuc2hvd0hpZGRlbj1lOmUmJm5lKHIsZSksS3Qoci5zaG93SGlkZGVuKSYmKHIuc2hvd0hpZGRlbj0hMSksS3Qoci5kZXB0aCkmJihyLmRlcHRoPTIpLEt0KHIuY29sb3JzKSYmKHIuY29sb3JzPSExKSxLdChyLmN1c3RvbUluc3BlY3QpJiYoci5jdXN0b21JbnNwZWN0PSEwKSxyLmNvbG9ycyYmKHIuc3R5bGl6ZT1xdCksV3Qocix0LHIuZGVwdGgpfWZ1bmN0aW9uIHF0KHQsZSl7dmFyIHI9enQuc3R5bGVzW2VdO3JldHVybiByPyIbWyIrenQuY29sb3JzW3JdWzBdKyJtIit0KyIbWyIrenQuY29sb3JzW3JdWzFdKyJtIjp0fWZ1bmN0aW9uIFl0KHQsZSl7cmV0dXJuIHR9ZnVuY3Rpb24gV3QodCxlLHIpe2lmKHQuY3VzdG9tSW5zcGVjdCYmZSYmZWUoZS5pbnNwZWN0KSYmZS5pbnNwZWN0IT09enQmJighZS5jb25zdHJ1Y3Rvcnx8ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1lKSl7dmFyIG49ZS5pbnNwZWN0KHIsdCk7cmV0dXJuIFZ0KG4pfHwobj1XdCh0LG4scikpLG59dmFyIGk9ZnVuY3Rpb24odCxlKXtpZihLdChlKSlyZXR1cm4gdC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihWdChlKSl7dmFyIHI9IiciK0pTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIHQuc3R5bGl6ZShyLCJzdHJpbmciKX1pZihuPWUsIm51bWJlciI9PXR5cGVvZiBuKXJldHVybiB0LnN0eWxpemUoIiIrZSwibnVtYmVyIik7dmFyIG47aWYoSnQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJib29sZWFuIik7aWYoSHQoZSkpcmV0dXJuIHQuc3R5bGl6ZSgibnVsbCIsIm51bGwiKX0odCxlKTtpZihpKXJldHVybiBpO3ZhciBvPU9iamVjdC5rZXlzKGUpLHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtlW3RdPSEwfSkpLGV9KG8pO2lmKHQuc2hvd0hpZGRlbiYmKG89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLHRlKGUpJiYoby5pbmRleE9mKCJtZXNzYWdlIik+PTB8fG8uaW5kZXhPZigiZGVzY3JpcHRpb24iKT49MCkpcmV0dXJuICR0KGUpO2lmKDA9PT1vLmxlbmd0aCl7aWYoZWUoZSkpe3ZhciBhPWUubmFtZT8iOiAiK2UubmFtZToiIjtyZXR1cm4gdC5zdHlsaXplKCJbRnVuY3Rpb24iK2ErIl0iLCJzcGVjaWFsIil9aWYoWnQoZSkpcmV0dXJuIHQuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpO2lmKFh0KGUpKXJldHVybiB0LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwiZGF0ZSIpO2lmKHRlKGUpKXJldHVybiAkdChlKX12YXIgdSxoLGY9IiIsYz0hMSxsPVsieyIsIn0iXTsodT1lLEFycmF5LmlzQXJyYXkodSkmJihjPSEwLGw9WyJbIiwiXSJdKSxlZShlKSkmJihmPSIgW0Z1bmN0aW9uIisoZS5uYW1lPyI6ICIrZS5uYW1lOiIiKSsiXSIpO3JldHVybiBadChlKSYmKGY9IiAiK1JlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSksWHQoZSkmJihmPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKGUpKSx0ZShlKSYmKGY9IiAiKyR0KGUpKSwwIT09by5sZW5ndGh8fGMmJjAhPWUubGVuZ3RoP3I8MD9adChlKT90LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJyZWdleHAiKTp0LnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOih0LnNlZW4ucHVzaChlKSxoPWM/ZnVuY3Rpb24odCxlLHIsbixpKXtmb3IodmFyIG89W10scz0wLGE9ZS5sZW5ndGg7czxhOysrcylpZShlLFN0cmluZyhzKSk/by5wdXNoKEd0KHQsZSxyLG4sU3RyaW5nKHMpLCEwKSk6by5wdXNoKCIiKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbihpKXtpLm1hdGNoKC9eXGQrJC8pfHxvLnB1c2goR3QodCxlLHIsbixpLCEwKSl9KSksb30odCxlLHIscyxvKTpvLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIEd0KHQsZSxyLHMsbixjKX0pKSx0LnNlZW4ucG9wKCksZnVuY3Rpb24odCxlLHIpe2lmKHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlLmluZGV4T2YoIlxuIiksdCtlLnJlcGxhY2UoL1x1MDAxYlxbXGRcZD9tL2csIiIpLmxlbmd0aCsxfSksMCk+NjApcmV0dXJuIHJbMF0rKCIiPT09ZT8iIjplKyJcbiAiKSsiICIrdC5qb2luKCIsXG4gICIpKyIgIityWzFdO3JldHVybiByWzBdK2UrIiAiK3Quam9pbigiLCAiKSsiICIrclsxXX0oaCxmLGwpKTpsWzBdK2YrbFsxXX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4iWyIrRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkrIl0ifWZ1bmN0aW9uIEd0KHQsZSxyLG4saSxvKXt2YXIgcyxhLHU7aWYoKHU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpfHx7dmFsdWU6ZVtpXX0pLmdldD9hPXUuc2V0P3Quc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOnQuc3R5bGl6ZSgiW0dldHRlcl0iLCJzcGVjaWFsIik6dS5zZXQmJihhPXQuc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLGllKG4saSl8fChzPSJbIitpKyJdIiksYXx8KHQuc2Vlbi5pbmRleE9mKHUudmFsdWUpPDA/KGE9SHQocik/V3QodCx1LnZhbHVlLG51bGwpOld0KHQsdS52YWx1ZSxyLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1vP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAiK3R9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiAgICIrdH0pKS5qb2luKCJcbiIpKTphPXQuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksS3Qocykpe2lmKG8mJmkubWF0Y2goL15cZCskLykpcmV0dXJuIGE7KHM9SlNPTi5zdHJpbmdpZnkoIiIraSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KHM9cy5zdWJzdHIoMSxzLmxlbmd0aC0yKSxzPXQuc3R5bGl6ZShzLCJuYW1lIikpOihzPXMucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpLnJlcGxhY2UoLyheInwiJCkvZywiJyIpLHM9dC5zdHlsaXplKHMsInN0cmluZyIpKX1yZXR1cm4gcysiOiAiK2F9ZnVuY3Rpb24gSnQodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBIdCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gVnQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fWZ1bmN0aW9uIEt0KHQpe3JldHVybiB2b2lkIDA9PT10fWZ1bmN0aW9uIFp0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgUmVnRXhwXSI9PT1yZSh0KX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIFh0KHQpe3JldHVybiBRdCh0KSYmIltvYmplY3QgRGF0ZV0iPT09cmUodCl9ZnVuY3Rpb24gdGUodCl7cmV0dXJuIFF0KHQpJiYoIltvYmplY3QgRXJyb3JdIj09PXJlKHQpfHx0IGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIGVlKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHJlKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbmUodCxlKXtpZighZXx8IVF0KGUpKXJldHVybiB0O2Zvcih2YXIgcj1PYmplY3Qua2V5cyhlKSxuPXIubGVuZ3RoO24tLTspdFtyW25dXT1lW3Jbbl1dO3JldHVybiB0fWZ1bmN0aW9uIGllKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIG9lKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH16dC5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LHp0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LG9lLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXtkYXRhOnQsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWU6dGhpcy5oZWFkPWUsdGhpcy50YWlsPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LG9lLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgsdH19LG9lLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfSxvZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxyPSIiK2UuZGF0YTtlPWUubmV4dDspcis9dCtlLmRhdGE7cmV0dXJuIHJ9LG9lLnByb3RvdHlwZS5jb25jYXQ9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBBLmFsbG9jKDApO2lmKDE9PT10aGlzLmxlbmd0aClyZXR1cm4gdGhpcy5oZWFkLmRhdGE7Zm9yKHZhciBlPUEuYWxsb2NVbnNhZmUodD4+PjApLHI9dGhpcy5oZWFkLG49MDtyOylyLmRhdGEuY29weShlLG4pLG4rPXIuZGF0YS5sZW5ndGgscj1yLm5leHQ7cmV0dXJuIGV9O3ZhciBzZT1BLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0JiZ0LnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gYWUodCl7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9KHR8fCJ1dGY4IikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywiIiksZnVuY3Rpb24odCl7aWYodCYmIXNlKHQpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KX0odCksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGY4Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9MzticmVhaztjYXNlInVjczIiOmNhc2UidXRmMTZsZSI6dGhpcy5zdXJyb2dhdGVTaXplPTIsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1oZTticmVhaztjYXNlImJhc2U2NCI6dGhpcy5zdXJyb2dhdGVTaXplPTMsdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mZTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkKHRoaXMud3JpdGU9dWUpfXRoaXMuY2hhckJ1ZmZlcj1uZXcgQSg2KSx0aGlzLmNoYXJSZWNlaXZlZD0wLHRoaXMuY2hhckxlbmd0aD0wfWZ1bmN0aW9uIHVlKHQpe3JldHVybiB0LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGhlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTIsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzI6MH1mdW5jdGlvbiBmZSh0KXt0aGlzLmNoYXJSZWNlaXZlZD10Lmxlbmd0aCUzLHRoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9YWUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0iIjt0aGlzLmNoYXJMZW5ndGg7KXt2YXIgcj10Lmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDp0Lmxlbmd0aDtpZih0LmNvcHkodGhpcy5jaGFyQnVmZmVyLHRoaXMuY2hhclJlY2VpdmVkLDAsciksdGhpcy5jaGFyUmVjZWl2ZWQrPXIsdGhpcy5jaGFyUmVjZWl2ZWQ8dGhpcy5jaGFyTGVuZ3RoKXJldHVybiIiO2lmKHQ9dC5zbGljZShyLHQubGVuZ3RoKSwhKChpPShlPXRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZykpLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkpPj01NTI5NiYmaTw9NTYzMTkpKXtpZih0aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MCwwPT09dC5sZW5ndGgpcmV0dXJuIGU7YnJlYWt9dGhpcy5jaGFyTGVuZ3RoKz10aGlzLnN1cnJvZ2F0ZVNpemUsZT0iIn10aGlzLmRldGVjdEluY29tcGxldGVDaGFyKHQpO3ZhciBuPXQubGVuZ3RoO3RoaXMuY2hhckxlbmd0aCYmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCx0Lmxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZCxuKSxuLT10aGlzLmNoYXJSZWNlaXZlZCk7dmFyIGk7bj0oZSs9dC50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsbikpLmxlbmd0aC0xO2lmKChpPWUuY2hhckNvZGVBdChuKSk+PTU1Mjk2JiZpPD01NjMxOSl7dmFyIG89dGhpcy5zdXJyb2dhdGVTaXplO3JldHVybiB0aGlzLmNoYXJMZW5ndGgrPW8sdGhpcy5jaGFyUmVjZWl2ZWQrPW8sdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLG8sMCxvKSx0LmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxvKSxlLnN1YnN0cmluZygwLG4pfXJldHVybiBlfSxhZS5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoPj0zPzM6dC5sZW5ndGg7ZT4wO2UtLSl7dmFyIHI9dFt0Lmxlbmd0aC1lXTtpZigxPT1lJiZyPj41PT02KXt0aGlzLmNoYXJMZW5ndGg9MjticmVha31pZihlPD0yJiZyPj40PT0xNCl7dGhpcy5jaGFyTGVuZ3RoPTM7YnJlYWt9aWYoZTw9MyYmcj4+Mz09MzApe3RoaXMuY2hhckxlbmd0aD00O2JyZWFrfX10aGlzLmNoYXJSZWNlaXZlZD1lfSxhZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPSIiO2lmKHQmJnQubGVuZ3RoJiYoZT10aGlzLndyaXRlKHQpKSx0aGlzLmNoYXJSZWNlaXZlZCl7dmFyIHI9dGhpcy5jaGFyUmVjZWl2ZWQsbj10aGlzLmNoYXJCdWZmZXIsaT10aGlzLmVuY29kaW5nO2UrPW4uc2xpY2UoMCxyKS50b1N0cmluZyhpKX1yZXR1cm4gZX0scGUuUmVhZGFibGVTdGF0ZT1sZTt2YXIgY2U9ZnVuY3Rpb24odCl7aWYoS3QoTnQpJiYoTnQ9QnQuZW52Lk5PREVfREVCVUd8fCIiKSx0PXQudG9VcHBlckNhc2UoKSwhRnRbdF0paWYobmV3IFJlZ0V4cCgiXFxiIit0KyJcXGIiLCJpIikudGVzdChOdCkpe0Z0W3RdPWZ1bmN0aW9uKCl7dmFyIGU9SXQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsdCwwLGUpfX1lbHNlIEZ0W3RdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gRnRbdF19KCJzdHJlYW0iKTtmdW5jdGlvbiBsZSh0LGUpe3Q9dHx8e30sdGhpcy5vYmplY3RNb2RlPSEhdC5vYmplY3RNb2RlLGUgaW5zdGFuY2VvZiBGZSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciByPXQuaGlnaFdhdGVyTWFyayxuPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9cnx8MD09PXI/cjpuLHRoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyayx0aGlzLmJ1ZmZlcj1uZXcgb2UsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5yYW5PdXQ9ITEsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKHRoaXMuZGVjb2Rlcj1uZXcgYWUodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBwZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBwZSkpcmV0dXJuIG5ldyBwZSh0KTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBsZSh0LHRoaXMpLHRoaXMucmVhZGFibGU9ITAsdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmKHRoaXMuX3JlYWQ9dC5yZWFkKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gZGUodCxlLHIsbixpKXt2YXIgbz1mdW5jdGlvbih0LGUpe3ZhciByPW51bGw7QS5pc0J1ZmZlcihlKXx8InN0cmluZyI9PXR5cGVvZiBlfHxudWxsPT1lfHx0Lm9iamVjdE1vZGV8fChyPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7cmV0dXJuIHJ9KGUscik7aWYobyl0LmVtaXQoImVycm9yIixvKTtlbHNlIGlmKG51bGw9PT1yKWUucmVhZGluZz0hMSxmdW5jdGlvbih0LGUpe2lmKGUuZW5kZWQpcmV0dXJuO2lmKGUuZGVjb2Rlcil7dmFyIHI9ZS5kZWNvZGVyLmVuZCgpO3ImJnIubGVuZ3RoJiYoZS5idWZmZXIucHVzaChyKSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgpfWUuZW5kZWQ9ITAseWUodCl9KHQsZSk7ZWxzZSBpZihlLm9iamVjdE1vZGV8fHImJnIubGVuZ3RoPjApaWYoZS5lbmRlZCYmIWkpe3ZhciBzPW5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKTt0LmVtaXQoImVycm9yIixzKX1lbHNlIGlmKGUuZW5kRW1pdHRlZCYmaSl7dmFyIGE9bmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpO3QuZW1pdCgiZXJyb3IiLGEpfWVsc2V7dmFyIHU7IWUuZGVjb2Rlcnx8aXx8bnx8KHI9ZS5kZWNvZGVyLndyaXRlKHIpLHU9IWUub2JqZWN0TW9kZSYmMD09PXIubGVuZ3RoKSxpfHwoZS5yZWFkaW5nPSExKSx1fHwoZS5mbG93aW5nJiYwPT09ZS5sZW5ndGgmJiFlLnN5bmM/KHQuZW1pdCgiZGF0YSIsciksdC5yZWFkKDApKTooZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoLGk/ZS5idWZmZXIudW5zaGlmdChyKTplLmJ1ZmZlci5wdXNoKHIpLGUubmVlZFJlYWRhYmxlJiZ5ZSh0KSkpLGZ1bmN0aW9uKHQsZSl7ZS5yZWFkaW5nTW9yZXx8KGUucmVhZGluZ01vcmU9ITAsd3QoYmUsdCxlKSl9KHQsZSl9ZWxzZSBpfHwoZS5yZWFkaW5nPSExKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIXQuZW5kZWQmJih0Lm5lZWRSZWFkYWJsZXx8dC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrfHwwPT09dC5sZW5ndGgpfShlKX14dChwZSxlKSxwZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZXx8InN0cmluZyIhPXR5cGVvZiB0fHwoZT1lfHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYodD1BLmZyb20odCxlKSxlPSIiKSxkZSh0aGlzLHIsdCxlLCExKX0scGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRlKHRoaXMsdGhpcy5fcmVhZGFibGVTdGF0ZSx0LCIiLCEwKX0scGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHBlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBhZSh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307ZnVuY3Rpb24gZ2UodCxlKXtyZXR1cm4gdDw9MHx8MD09PWUubGVuZ3RoJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6dCE9dD9lLmZsb3dpbmcmJmUubGVuZ3RoP2UuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6ZS5sZW5ndGg6KHQ+ZS5oaWdoV2F0ZXJNYXJrJiYoZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj04Mzg4NjA4P3Q9ODM4ODYwODoodC0tLHR8PXQ+Pj4xLHR8PXQ+Pj4yLHR8PXQ+Pj40LHR8PXQ+Pj44LHR8PXQ+Pj4xNix0KyspLHR9KHQpKSx0PD1lLmxlbmd0aD90OmUuZW5kZWQ/ZS5sZW5ndGg6KGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiB5ZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoY2UoImVtaXRSZWFkYWJsZSIsZS5mbG93aW5nKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMCxlLnN5bmM/d3QodmUsdCk6dmUodCkpfWZ1bmN0aW9uIHZlKHQpe2NlKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLF9lKHQpfWZ1bmN0aW9uIGJlKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihjZSgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSx0LnJlYWQoMCksciE9PWUubGVuZ3RoKTspcj1lLmxlbmd0aDtlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIG1lKHQpe2NlKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gd2UodCxlKXtlLnJlYWRpbmd8fChjZSgicmVzdW1lIHJlYWQgMCIpLHQucmVhZCgwKSksZS5yZXN1bWVTY2hlZHVsZWQ9ITEsZS5hd2FpdERyYWluPTAsdC5lbWl0KCJyZXN1bWUiKSxfZSh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBfZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2ZvcihjZSgiZmxvdyIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJm51bGwhPT10LnJlYWQoKTspO31mdW5jdGlvbiBTZSh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP3I9ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KHI9ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6cj1mdW5jdGlvbih0LGUscil7dmFyIG47dDxlLmhlYWQuZGF0YS5sZW5ndGg/KG49ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6bj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpyP2Z1bmN0aW9uKHQsZSl7dmFyIHI9ZS5oZWFkLG49MSxpPXIuZGF0YTt0LT1pLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHM9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsrbixyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytufXJldHVybiBlLmxlbmd0aC09bixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIHI9QS5hbGxvY1Vuc2FmZSh0KSxuPWUuaGVhZCxpPTE7bi5kYXRhLmNvcHkociksdC09bi5kYXRhLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHM9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShyLHIubGVuZ3RoLXQsMCxzKSwwPT09KHQtPXMpKXtzPT09by5sZW5ndGg/KCsraSxuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZShzKSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxyfSh0LGUpO3JldHVybiBufSh0LGUuYnVmZmVyLGUuZGVjb2Rlcikscik7dmFyIHJ9ZnVuY3Rpb24gRWUodCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtpZihlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7ZS5lbmRFbWl0dGVkfHwoZS5lbmRlZD0hMCx3dChrZSxlLHQpKX1mdW5jdGlvbiBrZSh0LGUpe3QuZW5kRW1pdHRlZHx8MCE9PXQubGVuZ3RofHwodC5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gQWUoKXt9ZnVuY3Rpb24gVGUodCxlLHIpe3RoaXMuY2h1bms9dCx0aGlzLmVuY29kaW5nPWUsdGhpcy5jYWxsYmFjaz1yLHRoaXMubmV4dD1udWxsfWZ1bmN0aW9uIE9lKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2dldDpEdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIpfSksdD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMTt2YXIgaT0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWksdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciByPXQuX3dyaXRhYmxlU3RhdGUsbj1yLnN5bmMsaT1yLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0ociksZSkhZnVuY3Rpb24odCxlLHIsbixpKXstLWUucGVuZGluZ2NiLHI/d3QoaSxuKTppKG4pO3QuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHQuZW1pdCgiZXJyb3IiLG4pfSh0LHIsbixlLGkpO2Vsc2V7dmFyIG89TWUocik7b3x8ci5jb3JrZWR8fHIuYnVmZmVyUHJvY2Vzc2luZ3x8IXIuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0LHIpLG4/d3QoQ2UsdCxyLG8saSk6Q2UodCxyLG8saSl9fShlLHQpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZSh0aGlzKX1mdW5jdGlvbiBqZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBqZXx8dGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IGplKHQpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IE9lKHQsdGhpcyksdGhpcy53cml0YWJsZT0hMCx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGUmJih0aGlzLl93cml0ZT10LndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZXYmJih0aGlzLl93cml0ZXY9dC53cml0ZXYpKSxlLmNhbGwodGhpcyl9ZnVuY3Rpb24gTGUodCxlLHIsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAscj90Ll93cml0ZXYoaSxlLm9ud3JpdGUpOnQuX3dyaXRlKGksbyxlLm9ud3JpdGUpLGUuc3luYz0hMX1mdW5jdGlvbiBDZSh0LGUscixuKXtyfHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0sbigpLHhlKHQsZSl9ZnVuY3Rpb24gUGUodCxlKXtlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIHI9ZS5idWZmZXJlZFJlcXVlc3Q7aWYodC5fd3JpdGV2JiZyJiZyLm5leHQpe3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQsaT1uZXcgQXJyYXkobiksbz1lLmNvcmtlZFJlcXVlc3RzRnJlZTtvLmVudHJ5PXI7Zm9yKHZhciBzPTA7cjspaVtzXT1yLHI9ci5uZXh0LHMrPTE7TGUodCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBVZShlKX1lbHNle2Zvcig7cjspe3ZhciBhPXIuY2h1bmssdT1yLmVuY29kaW5nLGg9ci5jYWxsYmFjaztpZihMZSh0LGUsITEsZS5vYmplY3RNb2RlPzE6YS5sZW5ndGgsYSx1LGgpLHI9ci5uZXh0LGUud3JpdGluZylicmVha31udWxsPT09ciYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsZS5idWZmZXJlZFJlcXVlc3Q9cixlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQuZW5kaW5nJiYwPT09dC5sZW5ndGgmJm51bGw9PT10LmJ1ZmZlcmVkUmVxdWVzdCYmIXQuZmluaXNoZWQmJiF0LndyaXRpbmd9ZnVuY3Rpb24gQmUodCxlKXtlLnByZWZpbmlzaGVkfHwoZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKX1mdW5jdGlvbiB4ZSh0LGUpe3ZhciByPU1lKGUpO3JldHVybiByJiYoMD09PWUucGVuZGluZ2NiPyhCZSh0LGUpLGUuZmluaXNoZWQ9ITAsdC5lbWl0KCJmaW5pc2giKSk6QmUodCxlKSkscn1mdW5jdGlvbiBVZSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbihyKXt2YXIgbj1lLmVudHJ5O2ZvcihlLmVudHJ5PW51bGw7bjspe3ZhciBpPW4uY2FsbGJhY2s7dC5wZW5kaW5nY2ItLSxpKHIpLG49bi5uZXh0fXQuY29ya2VkUmVxdWVzdHNGcmVlP3QuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9ZTp0LmNvcmtlZFJlcXVlc3RzRnJlZT1lfX1wZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbih0KXtjZSgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLHI9dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gY2UoInJlYWQ6IGVtaXRSZWFkYWJsZSIsZS5sZW5ndGgsZS5lbmRlZCksMD09PWUubGVuZ3RoJiZlLmVuZGVkP0VlKHRoaXMpOnllKHRoaXMpLG51bGw7aWYoMD09PSh0PWdlKHQsZSkpJiZlLmVuZGVkKXJldHVybiAwPT09ZS5sZW5ndGgmJkVlKHRoaXMpLG51bGw7dmFyIG4saT1lLm5lZWRSZWFkYWJsZTtyZXR1cm4gY2UoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmY2UoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixpPSEwKSxlLmVuZGVkfHxlLnJlYWRpbmc/Y2UoInJlYWRpbmcgb3IgZW5kZWQiLGk9ITEpOmkmJihjZSgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1nZShyLGUpKSksbnVsbD09PShuPXQ+MD9TZSh0LGUpOm51bGwpPyhlLm5lZWRSZWFkYWJsZT0hMCx0PTApOmUubGVuZ3RoLT10LDA9PT1lLmxlbmd0aCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksciE9PXQmJmUuZW5kZWQmJkVlKHRoaXMpKSxudWxsIT09biYmdGhpcy5lbWl0KCJkYXRhIixuKSxufSxwZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LHBlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9dDticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyx0XTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaCh0KX1uLnBpcGVzQ291bnQrPTEsY2UoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsbi5waXBlc0NvdW50LGUpO3ZhciBpPSFlfHwhMSE9PWUuZW5kP3M6aDtmdW5jdGlvbiBvKHQpe2NlKCJvbnVucGlwZSIpLHQ9PT1yJiZoKCl9ZnVuY3Rpb24gcygpe2NlKCJvbmVuZCIpLHQuZW5kKCl9bi5lbmRFbWl0dGVkP3d0KGkpOnIub25jZSgiZW5kIixpKSx0Lm9uKCJ1bnBpcGUiLG8pO3ZhciBhPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Y2UoInBpcGVPbkRyYWluIixlLmF3YWl0RHJhaW4pLGUuYXdhaXREcmFpbiYmZS5hd2FpdERyYWluLS0sMD09PWUuYXdhaXREcmFpbiYmdC5saXN0ZW5lcnMoImRhdGEiKS5sZW5ndGgmJihlLmZsb3dpbmc9ITAsX2UodCkpfX0ocik7dC5vbigiZHJhaW4iLGEpO3ZhciB1PSExO2Z1bmN0aW9uIGgoKXtjZSgiY2xlYW51cCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSx0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLGQpLHQucmVtb3ZlTGlzdGVuZXIoImRyYWluIixhKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvKSxyLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHMpLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIsaCksci5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsYyksdT0hMCwhbi5hd2FpdERyYWlufHx0Ll93cml0YWJsZVN0YXRlJiYhdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fGEoKX12YXIgZj0hMTtmdW5jdGlvbiBjKGUpe2NlKCJvbmRhdGEiKSxmPSExLCExIT09dC53cml0ZShlKXx8Znx8KCgxPT09bi5waXBlc0NvdW50JiZuLnBpcGVzPT09dHx8bi5waXBlc0NvdW50PjEmJi0xIT09UmUobi5waXBlcyx0KSkmJiF1JiYoY2UoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsci5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxmPSEwKSxyLnBhdXNlKCkpfWZ1bmN0aW9uIGwoZSl7dmFyIHI7Y2UoIm9uZXJyb3IiLGUpLGcoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbCksMD09PShyPSJlcnJvciIsdC5saXN0ZW5lcnMocikubGVuZ3RoKSYmdC5lbWl0KCJlcnJvciIsZSl9ZnVuY3Rpb24gcCgpe3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksZygpfWZ1bmN0aW9uIGQoKXtjZSgib25maW5pc2giKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIscCksZygpfWZ1bmN0aW9uIGcoKXtjZSgidW5waXBlIiksci51bnBpcGUodCl9cmV0dXJuIHIub24oImRhdGEiLGMpLGZ1bmN0aW9uKHQsZSxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUscik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/QXJyYXkuaXNBcnJheSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KHIpOnQuX2V2ZW50c1tlXT1bcix0Ll9ldmVudHNbZV1dOnQub24oZSxyKX0odCwiZXJyb3IiLGwpLHQub25jZSgiY2xvc2UiLHApLHQub25jZSgiZmluaXNoIixkKSx0LmVtaXQoInBpcGUiLHIpLG4uZmxvd2luZ3x8KGNlKCJwaXBlIHJlc3VtZSIpLHIucmVzdW1lKCkpLHR9LHBlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZigwPT09ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHQmJnQhPT1lLnBpcGVzfHwodHx8KHQ9ZS5waXBlcyksZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMSx0JiZ0LmVtaXQoInVucGlwZSIsdGhpcykpLHRoaXM7aWYoIXQpe3ZhciByPWUucGlwZXMsbj1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPG47aSsrKXJbaV0uZW1pdCgidW5waXBlIix0aGlzKTtyZXR1cm4gdGhpc312YXIgbz1SZShlLnBpcGVzLHQpO3JldHVybi0xPT09b3x8KGUucGlwZXMuc3BsaWNlKG8sMSksZS5waXBlc0NvdW50LT0xLDE9PT1lLnBpcGVzQ291bnQmJihlLnBpcGVzPWUucGlwZXNbMF0pLHQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpc30scGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQscil7dmFyIG49ZS5wcm90b3R5cGUub24uY2FsbCh0aGlzLHQscik7aWYoImRhdGEiPT09dCkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT10KXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kuZW5kRW1pdHRlZHx8aS5yZWFkYWJsZUxpc3RlbmluZ3x8KGkucmVhZGFibGVMaXN0ZW5pbmc9aS5uZWVkUmVhZGFibGU9ITAsaS5lbWl0dGVkUmVhZGFibGU9ITEsaS5yZWFkaW5nP2kubGVuZ3RoJiZ5ZSh0aGlzKTp3dChtZSx0aGlzKSl9cmV0dXJuIG59LHBlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1wZS5wcm90b3R5cGUub24scGUucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHQuZmxvd2luZ3x8KGNlKCJyZXN1bWUiKSx0LmZsb3dpbmc9ITAsZnVuY3Rpb24odCxlKXtlLnJlc3VtZVNjaGVkdWxlZHx8KGUucmVzdW1lU2NoZWR1bGVkPSEwLHd0KHdlLHQsZSkpfSh0aGlzLHQpKSx0aGlzfSxwZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGNlKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LHBlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMSxuPXRoaXM7Zm9yKHZhciBpIGluIHQub24oImVuZCIsKGZ1bmN0aW9uKCl7aWYoY2UoIndyYXBwZWQgZW5kIiksZS5kZWNvZGVyJiYhZS5lbmRlZCl7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZuLnB1c2godCl9bi5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoY2UoIndyYXBwZWQgZGF0YSIpLGUuZGVjb2RlciYmKGk9ZS5kZWNvZGVyLndyaXRlKGkpKSxlLm9iamVjdE1vZGUmJm51bGw9PWkpfHwoZS5vYmplY3RNb2RlfHxpJiZpLmxlbmd0aCkmJihuLnB1c2goaSl8fChyPSEwLHQucGF1c2UoKSkpfSkpLHQpdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbaV0mJih0aGlzW2ldPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KGkpKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspZSh0W3JdLHIpfShbImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXSwoZnVuY3Rpb24oZSl7dC5vbihlLG4uZW1pdC5iaW5kKG4sZSkpfSkpLG4uX3JlYWQ9ZnVuY3Rpb24oZSl7Y2UoIndyYXBwZWQgX3JlYWQiLGUpLHImJihyPSExLHQucmVzdW1lKCkpfSxufSxwZS5fZnJvbUxpc3Q9U2UsamUuV3JpdGFibGVTdGF0ZT1PZSx4dChqZSxlKSxPZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxqZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpKX0samUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlLGk9ITE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxBLmlzQnVmZmVyKHQpP2U9ImJ1ZmZlciI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1BZSksbi5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsciksd3QoZSxyKX0odGhpcyxyKTpmdW5jdGlvbih0LGUscixuKXt2YXIgaT0hMCxvPSExO3JldHVybiBudWxsPT09cj9vPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6QS5pc0J1ZmZlcihyKXx8InN0cmluZyI9PXR5cGVvZiByfHx2b2lkIDA9PT1yfHxlLm9iamVjdE1vZGV8fChvPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksbyYmKHQuZW1pdCgiZXJyb3IiLG8pLHd0KG4sbyksaT0hMSksaX0odGhpcyxuLHQscikmJihuLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24odCxlLHIsbixpKXtyPWZ1bmN0aW9uKHQsZSxyKXt0Lm9iamVjdE1vZGV8fCExPT09dC5kZWNvZGVTdHJpbmdzfHwic3RyaW5nIiE9dHlwZW9mIGV8fChlPUEuZnJvbShlLHIpKTtyZXR1cm4gZX0oZSxyLG4pLEEuaXNCdWZmZXIocikmJihuPSJidWZmZXIiKTt2YXIgbz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aDtlLmxlbmd0aCs9bzt2YXIgcz1lLmxlbmd0aDxlLmhpZ2hXYXRlck1hcms7c3x8KGUubmVlZERyYWluPSEwKTtpZihlLndyaXRpbmd8fGUuY29ya2VkKXt2YXIgYT1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q7ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW5ldyBUZShyLG4saSksYT9hLm5leHQ9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OmUuYnVmZmVyZWRSZXF1ZXN0PWUubGFzdEJ1ZmZlcmVkUmVxdWVzdCxlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgTGUodCxlLCExLG8scixuLGkpO3JldHVybiBzfSh0aGlzLG4sdCxlLHIpKSxpfSxqZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LGplLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl93cml0YWJsZVN0YXRlO3QuY29ya2VkJiYodC5jb3JrZWQtLSx0LndyaXRpbmd8fHQuY29ya2VkfHx0LmZpbmlzaGVkfHx0LmJ1ZmZlclByb2Nlc3Npbmd8fCF0LmJ1ZmZlcmVkUmVxdWVzdHx8UGUodGhpcyx0KSl9LGplLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKHQrIiIpLnRvTG93ZXJDYXNlKCkpPi0xKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz10LHRoaXN9LGplLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3IobmV3IEVycm9yKCJub3QgaW1wbGVtZW50ZWQiKSl9LGplLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsamUucHJvdG90eXBlLmVuZD1mdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTsiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxlPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksbnVsbCE9dCYmdGhpcy53cml0ZSh0LGUpLG4uY29ya2VkJiYobi5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxuLmVuZGluZ3x8bi5maW5pc2hlZHx8ZnVuY3Rpb24odCxlLHIpe2UuZW5kaW5nPSEwLHhlKHQsZSksciYmKGUuZmluaXNoZWQ/d3Qocik6dC5vbmNlKCJmaW5pc2giLHIpKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMsbixyKX0seHQoRmUscGUpO2Zvcih2YXIgSWU9T2JqZWN0LmtleXMoamUucHJvdG90eXBlKSxEZT0wO0RlPEllLmxlbmd0aDtEZSsrKXt2YXIgTmU9SWVbRGVdO0ZlLnByb3RvdHlwZVtOZV18fChGZS5wcm90b3R5cGVbTmVdPWplLnByb3RvdHlwZVtOZV0pfWZ1bmN0aW9uIEZlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEZlKSlyZXR1cm4gbmV3IEZlKHQpO3BlLmNhbGwodGhpcyx0KSxqZS5jYWxsKHRoaXMsdCksdCYmITE9PT10LnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksdCYmITE9PT10LndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLHQmJiExPT09dC5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsemUpfWZ1bmN0aW9uIHplKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHx3dChxZSx0aGlzKX1mdW5jdGlvbiBxZSh0KXt0LmVuZCgpfWZ1bmN0aW9uIFllKHQpe3RoaXMuYWZ0ZXJUcmFuc2Zvcm09ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQuX3RyYW5zZm9ybVN0YXRlO24udHJhbnNmb3JtaW5nPSExO3ZhciBpPW4ud3JpdGVjYjtpZighaSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT1yJiZ0LnB1c2gocik7aShlKTt2YXIgbz10Ll9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnQuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX0odCxlLHIpfSx0aGlzLm5lZWRUcmFuc2Zvcm09ITEsdGhpcy50cmFuc2Zvcm1pbmc9ITEsdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWNodW5rPW51bGwsdGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gV2UodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgV2UpKXJldHVybiBuZXcgV2UodCk7RmUuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPW5ldyBZZSh0aGlzKTt2YXIgZT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uY2UoInByZWZpbmlzaCIsKGZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2ZsdXNoP3RoaXMuX2ZsdXNoKChmdW5jdGlvbih0KXskZShlLHQpfSkpOiRlKGUpfSkpfWZ1bmN0aW9uICRlKHQsZSl7aWYoZSlyZXR1cm4gdC5lbWl0KCJlcnJvciIsZSk7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXQuX3RyYW5zZm9ybVN0YXRlO2lmKHIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYobi50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1mdW5jdGlvbiBHZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBHZSkpcmV0dXJuIG5ldyBHZSh0KTtXZS5jYWxsKHRoaXMsdCl9ZnVuY3Rpb24gSmUoKXtlLmNhbGwodGhpcyl9eHQoV2UsRmUpLFdlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsRmUucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHQsZSl9LFdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxXZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9cixuLndyaXRlY2h1bms9dCxuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19LFdlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0seHQoR2UsV2UpLEdlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyKG51bGwsdCl9LHh0KEplLGUpLEplLlJlYWRhYmxlPXBlLEplLldyaXRhYmxlPWplLEplLkR1cGxleD1GZSxKZS5UcmFuc2Zvcm09V2UsSmUuUGFzc1Rocm91Z2g9R2UsSmUuU3RyZWFtPUplLEplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcztmdW5jdGlvbiBpKGUpe3Qud3JpdGFibGUmJiExPT09dC53cml0ZShlKSYmbi5wYXVzZSYmbi5wYXVzZSgpfWZ1bmN0aW9uIG8oKXtuLnJlYWRhYmxlJiZuLnJlc3VtZSYmbi5yZXN1bWUoKX1uLm9uKCJkYXRhIixpKSx0Lm9uKCJkcmFpbiIsbyksdC5faXNTdGRpb3x8ciYmITE9PT1yLmVuZHx8KG4ub24oImVuZCIsYSksbi5vbigiY2xvc2UiLHUpKTt2YXIgcz0hMTtmdW5jdGlvbiBhKCl7c3x8KHM9ITAsdC5lbmQoKSl9ZnVuY3Rpb24gdSgpe3N8fChzPSEwLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJnQuZGVzdHJveSgpKX1mdW5jdGlvbiBoKHQpe2lmKGYoKSwwPT09ZS5saXN0ZW5lckNvdW50KHRoaXMsImVycm9yIikpdGhyb3cgdH1mdW5jdGlvbiBmKCl7bi5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsaSksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLG8pLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsYSksbi5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHUpLG4ucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsaCksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixmKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGYpfXJldHVybiBuLm9uKCJlcnJvciIsaCksdC5vbigiZXJyb3IiLGgpLG4ub24oImVuZCIsZiksbi5vbigiY2xvc2UiLGYpLHQub24oImNsb3NlIixmKSx0LmVtaXQoInBpcGUiLG4pLHR9O3ZhciBIZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3ZhciBWZSxLZSxaZT0oVmU9ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7ZSYmKHQuc3VwZXJfPWUsdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSkpfTp0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihlKXt0LnN1cGVyXz1lO3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgcix0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fX19LFZlKEtlPXtleHBvcnRzOnt9fSxLZS5leHBvcnRzKSxLZS5leHBvcnRzKTtsZXQgUWU9dHIoKTtmdW5jdGlvbiBYZSh0LGUpeygib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pO2xldCByPW5ldyBRZSh0KTt2YXIgbjtyZXR1cm4gci5fZnJvbT1BcnJheS5pc0FycmF5KGUpPyhuPShuPWUpLnNsaWNlKCksZnVuY3Rpb24odCxlKXtsZXQgcj1udWxsLGk9bi5sZW5ndGg/bi5zaGlmdCgpOm51bGw7aSBpbnN0YW5jZW9mIEVycm9yJiYocj1pLGk9bnVsbCksZShyLGkpfSk6ZXx8ZXIscn1mdW5jdGlvbiB0cih0LGUpe2Z1bmN0aW9uIHIoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByKGUpO3RoaXMuX3JlYWRpbmc9ITEsdGhpcy5fY2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtpZihuLmRlc3Ryb3llZClyZXR1cm47aWYodClyZXR1cm4gbi5kZXN0cm95KHQpO2lmKG51bGw9PT1lKXJldHVybiBuLnB1c2gobnVsbCk7bi5fcmVhZGluZz0hMSxuLnB1c2goZSkmJm4uX3JlYWQoaSl9LHRoaXMuZGVzdHJveWVkPSExLHBlLmNhbGwodGhpcyxlfHx0KTtsZXQgbj10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZT10LHQ9e30pLHQ9cnIodCksWmUocixwZSksci5wcm90b3R5cGUuX2Zyb209ZXx8ZXIsci5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGluZ3x8dGhpcy5kZXN0cm95ZWR8fCh0aGlzLl9yZWFkaW5nPSEwLHRoaXMuX2Zyb20odCx0aGlzLl9jYWxsYmFjaykpfSxyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjt0aGlzLmRlc3Ryb3llZD0hMDtsZXQgZT10aGlzO3Byb2Nlc3MubmV4dFRpY2soKGZ1bmN0aW9uKCl7dCYmZS5lbWl0KCJlcnJvciIsdCksZS5lbWl0KCJjbG9zZSIpfSkpfSxyfWZ1bmN0aW9uIGVyKCl7fWZ1bmN0aW9uIHJyKHQpe3JldHVybiB0PXR8fHt9fVhlLmN0b3I9dHIsWGUub2JqPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxBcnJheS5pc0FycmF5KHQpKSYmKGU9dCx0PXt9KSwodD1ycih0KSkub2JqZWN0TW9kZT0hMCx0LmhpZ2hXYXRlck1hcms9MTYsWGUodCxlKX07dmFyIG5yLGlyPTEsb3I9e30sc3I9ITEsYXI9bC5kb2N1bWVudDtmdW5jdGlvbiB1cih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSkscj0wO3I8ZS5sZW5ndGg7cisrKWVbcl09YXJndW1lbnRzW3IrMV07dmFyIG49e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gb3JbaXJdPW4sbnIoaXIpLGlyKyt9ZnVuY3Rpb24gaHIodCl7aWYoc3Ipc2V0VGltZW91dChociwwLHQpO2Vsc2V7dmFyIGU9b3JbdF07aWYoZSl7c3I9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLHI9dC5hcmdzO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShyWzBdKTticmVhaztjYXNlIDI6ZShyWzBdLHJbMV0pO2JyZWFrO2Nhc2UgMzplKHJbMF0sclsxXSxyWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLHIpfX0oZSl9ZmluYWxseXshZnVuY3Rpb24odCl7ZGVsZXRlIG9yW3RdfSh0KSxzcj0hMX19fX12YXIgZnIsY3IsbHIscHIsZHI9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YobCk7ZnVuY3Rpb24gZ3IodCl7bGV0IGUscj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7aWYoZT0iW29iamVjdCBQcm9taXNlXSI9PT1yLGUpcmV0dXJuITA7aWYoIltvYmplY3QgRnVuY3Rpb25dIiE9PXIpcmV0dXJuITE7dHJ5e2U9ImZ1bmN0aW9uIiE9dHlwZW9mIHQuc3Vic2NyaWJlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufWNhdGNoKHQpe31yZXR1cm4gZX1mdW5jdGlvbiB5cih0KXtsZXQgZSxyLG47ZnVuY3Rpb24gaShpKXsoKHQ9aSlpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiFBLmlzQnVmZmVyKHQpKSYmKHQ9QS5mcm9tKHQpKSxlPWdyKHQpP3Q6bnVsbDtjb25zdCBvPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0mJiJzdHJpbmciIT10eXBlb2YgdCYmIUEuaXNCdWZmZXIodCk7cj1vP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGw7Y29uc3Qgcz0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07bj1zP3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dC5zbGljZSgpKSxpKHQpLFhlKChmdW5jdGlvbiBvKHMsYSl7aWYoZSlyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7aWYocil7Y29uc3QgdD1yLm5leHQoKTtyZXR1cm4gdm9pZCB1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9aWYobilyZXR1cm4gdm9pZChhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQgdXIoYSxudWxsLG51bGwpO2NvbnN0IHU9dC5zbGljZSgwLHMpO3Q9dC5zbGljZShzKSx1cihhLG51bGwsdSl9KSl9ZHI9ZHImJmRyLnNldFRpbWVvdXQ/ZHI6bCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGwucHJvY2Vzcyk/bnI9ZnVuY3Rpb24odCl7QnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7aHIodCl9KSl9OiFmdW5jdGlvbigpe2lmKGwucG9zdE1lc3NhZ2UmJiFsLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLGU9bC5vbm1lc3NhZ2U7cmV0dXJuIGwub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sbC5wb3N0TWVzc2FnZSgiIiwiKiIpLGwub25tZXNzYWdlPWUsdH19KCk/bC5NZXNzYWdlQ2hhbm5lbD8oKGNyPW5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2hyKHQuZGF0YSl9LG5yPWZ1bmN0aW9uKHQpe2NyLnBvcnQyLnBvc3RNZXNzYWdlKHQpfSk6YXImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gYXIuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KGZyPWFyLmRvY3VtZW50RWxlbWVudCxucj1mdW5jdGlvbih0KXt2YXIgZT1hci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2hyKHQpLGUub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZnIucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxmci5hcHBlbmRDaGlsZChlKX0pOm5yPWZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoaHIsMCx0KX06KGxyPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixwcj1mdW5jdGlvbih0KXt0LnNvdXJjZT09PWwmJiJzdHJpbmciPT10eXBlb2YgdC5kYXRhJiYwPT09dC5kYXRhLmluZGV4T2YobHIpJiZocigrdC5kYXRhLnNsaWNlKGxyLmxlbmd0aCkpfSxsLmFkZEV2ZW50TGlzdGVuZXI/bC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixwciwhMSk6bC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixwciksbnI9ZnVuY3Rpb24odCl7bC5wb3N0TWVzc2FnZShscit0LCIqIil9KSx5ci5vYmplY3Q9dD0+e2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpe2U9Z3IodD1pKT90Om51bGwscj0hZSYmdFtTeW1ib2wuaXRlcmF0b3JdP3RbU3ltYm9sLml0ZXJhdG9yXSgpOm51bGwsbj0hZSYmdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUub2JqKChmdW5jdGlvbiBvKHMsYSl7aWYoZSkoYXN5bmMoKT0+e3RyeXthd2FpdCBpKGF3YWl0IGUpLG8uY2FsbCh0aGlzLHMsYSl9Y2F0Y2godCl7YSh0KX19KSgpO2Vsc2UgaWYocil7Y29uc3QgdD1yLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9ZWxzZSBuPyhhc3luYygpPT57dHJ5e2NvbnN0IHQ9YXdhaXQgbi5uZXh0KCk7dXIoYSxudWxsLHQuZG9uZT9udWxsOnQudmFsdWUpfWNhdGNoKHQpe3VyKGEsdCl9fSkoKToodGhpcy5wdXNoKHQpLHVyKGEsbnVsbCxudWxsKSl9KSl9O3ZhciB2cj17fSxicj12ci5MRUZUX0JSQUNFPTEsbXI9dnIuUklHSFRfQlJBQ0U9Mix3cj12ci5MRUZUX0JSQUNLRVQ9Myxfcj12ci5SSUdIVF9CUkFDS0VUPTQsU3I9dnIuQ09MT049NSxFcj12ci5DT01NQT02LGtyPXZyLlRSVUU9NyxScj12ci5GQUxTRT04LEFyPXZyLk5VTEw9OSxUcj12ci5TVFJJTkc9MTAsT3I9dnIuTlVNQkVSPTExLGpyPXZyLlNUQVJUPTE3LExyPXZyLlNUT1A9MTgsQ3I9dnIuVFJVRTE9MzMsUHI9dnIuVFJVRTI9MzQsTXI9dnIuVFJVRTM9MzUsQnI9dnIuRkFMU0UxPTQ5LHhyPXZyLkZBTFNFMj01MCxVcj12ci5GQUxTRTM9NTEsSXI9dnIuRkFMU0U0PTUyLERyPXZyLk5VTEwxPTY1LE5yPXZyLk5VTEwyPTY2LEZyPXZyLk5VTEwzPTY3LHpyPXZyLk5VTUJFUjE9ODEscXI9dnIuTlVNQkVSMz04MyxZcj12ci5TVFJJTkcxPTk3LFdyPXZyLlNUUklORzI9OTgsJHI9dnIuU1RSSU5HMz05OSxHcj12ci5TVFJJTkc0PTEwMCxKcj12ci5TVFJJTkc1PTEwMSxIcj12ci5TVFJJTkc2PTEwMixWcj12ci5WQUxVRT0xMTMsS3I9dnIuS0VZPTExNCxacj12ci5PQkpFQ1Q9MTI5LFFyPXZyLkFSUkFZPTEzMCxYcj0iXFwiLmNoYXJDb2RlQXQoMCksdG49Ii8iLmNoYXJDb2RlQXQoMCksZW49IlxiIi5jaGFyQ29kZUF0KDApLHJuPSJcZiIuY2hhckNvZGVBdCgwKSxubj0iXG4iLmNoYXJDb2RlQXQoMCksb249IlxyIi5jaGFyQ29kZUF0KDApLHNuPSJcdCIuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBhbigpe3RoaXMudFN0YXRlPWpyLHRoaXMudmFsdWU9dm9pZCAwLHRoaXMuc3RyaW5nPXZvaWQgMCx0aGlzLnN0cmluZ0J1ZmZlcj1BLmFsbG9jP0EuYWxsb2MoNjU1MzYpOm5ldyBBKDY1NTM2KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudW5pY29kZT12b2lkIDAsdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCx0aGlzLmtleT12b2lkIDAsdGhpcy5tb2RlPXZvaWQgMCx0aGlzLnN0YWNrPVtdLHRoaXMuc3RhdGU9VnIsdGhpcy5ieXRlc19yZW1haW5pbmc9MCx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTAsdGhpcy50ZW1wX2J1ZmZzPXsyOm5ldyBBKDIpLDM6bmV3IEEoMyksNDpuZXcgQSg0KX0sdGhpcy5vZmZzZXQ9LTF9YW4udG9rbmFtPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyh2cikscj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7dmFyIGk9ZVtyXTtpZih2cltpXT09PXQpcmV0dXJuIGl9cmV0dXJuIHQmJiIweCIrdC50b1N0cmluZygxNil9O3ZhciB1bj1hbi5wcm90b3R5cGU7dW4ub25FcnJvcj1mdW5jdGlvbih0KXt0aHJvdyB0fSx1bi5jaGFyRXJyb3I9ZnVuY3Rpb24odCxlKXt0aGlzLnRTdGF0ZT1Mcix0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJVbmV4cGVjdGVkICIrSlNPTi5zdHJpbmdpZnkoU3RyaW5nLmZyb21DaGFyQ29kZSh0W2VdKSkrIiBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKX0sdW4uYXBwZW5kU3RyaW5nQ2hhcj1mdW5jdGlvbih0KXt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD49NjU1MzYmJih0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0aGlzLnN0cmluZ0J1ZmZlclt0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCsrXT10fSx1bi5hcHBlbmRTdHJpbmdCdWY9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQubGVuZ3RoOyJudW1iZXIiPT10eXBlb2YgZSYmKG49Im51bWJlciI9PXR5cGVvZiByP3I8MD90Lmxlbmd0aC1lK3I6ci1lOnQubGVuZ3RoLWUpLG48MCYmKG49MCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrbj42NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCksdC5jb3B5KHRoaXMuc3RyaW5nQnVmZmVyLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0LGUsciksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQrPW59LHVuLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9bmV3IEEodCkpO2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0aGlzLnRTdGF0ZT09PWpyKXtpZihlPXRbcl0sdGhpcy5vZmZzZXQrKywxMjM9PT1lKXRoaXMub25Ub2tlbihiciwieyIpO2Vsc2UgaWYoMTI1PT09ZSl0aGlzLm9uVG9rZW4obXIsIn0iKTtlbHNlIGlmKDkxPT09ZSl0aGlzLm9uVG9rZW4od3IsIlsiKTtlbHNlIGlmKDkzPT09ZSl0aGlzLm9uVG9rZW4oX3IsIl0iKTtlbHNlIGlmKDU4PT09ZSl0aGlzLm9uVG9rZW4oU3IsIjoiKTtlbHNlIGlmKDQ0PT09ZSl0aGlzLm9uVG9rZW4oRXIsIiwiKTtlbHNlIGlmKDExNj09PWUpdGhpcy50U3RhdGU9Q3I7ZWxzZSBpZigxMDI9PT1lKXRoaXMudFN0YXRlPUJyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLnRTdGF0ZT1EcjtlbHNlIGlmKDM0PT09ZSl0aGlzLnN0cmluZz0iIix0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoNDU9PT1lKXRoaXMuc3RyaW5nPSItIix0aGlzLnRTdGF0ZT16cjtlbHNlIGlmKGU+PTQ4JiZlPDY0KXRoaXMuc3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGU9cXI7ZWxzZSBpZigzMiE9PWUmJjkhPT1lJiYxMCE9PWUmJjEzIT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09WXIpaWYoZT10W3JdLHRoaXMuYnl0ZXNfcmVtYWluaW5nPjApe2Zvcih2YXIgaT0wO2k8dGhpcy5ieXRlc19yZW1haW5pbmc7aSsrKXRoaXMudGVtcF9idWZmc1t0aGlzLmJ5dGVzX2luX3NlcXVlbmNlXVt0aGlzLmJ5dGVzX2luX3NlcXVlbmNlLXRoaXMuYnl0ZXNfcmVtYWluaW5nK2ldPXRbaV07dGhpcy5hcHBlbmRTdHJpbmdCdWYodGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdKSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPXRoaXMuYnl0ZXNfcmVtYWluaW5nPTAscj1yK2ktMX1lbHNlIGlmKDA9PT10aGlzLmJ5dGVzX3JlbWFpbmluZyYmZT49MTI4KXtpZihlPD0xOTN8fGU+MjQ0KXJldHVybiB0aGlzLm9uRXJyb3IobmV3IEVycm9yKCJJbnZhbGlkIFVURi04IGNoYXJhY3RlciBhdCBwb3NpdGlvbiAiK3IrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnRTdGF0ZSkpKTtpZihlPj0xOTQmJmU8PTIyMyYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MiksZT49MjI0JiZlPD0yMzkmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTMpLGU+PTI0MCYmZTw9MjQ0JiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT00KSx0aGlzLmJ5dGVzX2luX3NlcXVlbmNlK3I+dC5sZW5ndGgpe2Zvcih2YXIgbz0wO288PXQubGVuZ3RoLTEtcjtvKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW29dPXRbcitvXTt0aGlzLmJ5dGVzX3JlbWFpbmluZz1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdC5sZW5ndGgscj10Lmxlbmd0aC0xfWVsc2UgdGhpcy5hcHBlbmRTdHJpbmdCdWYodCxyLHIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZSkscj1yK3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtMX1lbHNlIGlmKDM0PT09ZSl0aGlzLnRTdGF0ZT1qcix0aGlzLnN0cmluZys9dGhpcy5zdHJpbmdCdWZmZXIudG9TdHJpbmcoInV0ZjgiLDAsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy5vblRva2VuKFRyLHRoaXMuc3RyaW5nKSx0aGlzLm9mZnNldCs9QS5ieXRlTGVuZ3RoKHRoaXMuc3RyaW5nLCJ1dGY4IikrMSx0aGlzLnN0cmluZz12b2lkIDA7ZWxzZSBpZig5Mj09PWUpdGhpcy50U3RhdGU9V3I7ZWxzZXtpZighKGU+PTMyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSl9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVdyKWlmKDM0PT09KGU9dFtyXSkpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKGUpLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihYciksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0Nz09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKHRuKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDk4PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZW4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTAyPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIocm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTEwPT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIobm4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE0PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIob24pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoc24pLHRoaXMudFN0YXRlPVlyO2Vsc2V7aWYoMTE3IT09ZSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnVuaWNvZGU9IiIsdGhpcy50U3RhdGU9JHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PSRyfHx0aGlzLnRTdGF0ZT09PUdyfHx0aGlzLnRTdGF0ZT09PUpyfHx0aGlzLnRTdGF0ZT09PUhyKXtpZighKChlPXRbcl0pPj00OCYmZTw2NHx8ZT42NCYmZTw9NzB8fGU+OTYmJmU8PTEwMikpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7aWYodGhpcy51bmljb2RlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlKys9PT1Icil7dmFyIHM9cGFyc2VJbnQodGhpcy51bmljb2RlLDE2KTt0aGlzLnVuaWNvZGU9dm9pZCAwLHZvaWQgMCE9PXRoaXMuaGlnaFN1cnJvZ2F0ZSYmcz49NTYzMjAmJnM8NTczNDQ/KHRoaXMuYXBwZW5kU3RyaW5nQnVmKG5ldyBBKFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5oaWdoU3Vycm9nYXRlLHMpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCk6dm9pZCAwPT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NTI5NiYmczw1NjMyMD90aGlzLmhpZ2hTdXJyb2dhdGU9czoodm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiYodGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUpKSksdGhpcy5oaWdoU3Vycm9nYXRlPXZvaWQgMCksdGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZShzKSkpKSx0aGlzLnRTdGF0ZT1Zcn19ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXpyfHx0aGlzLnRTdGF0ZT09PXFyKXN3aXRjaChlPXRbcl0pe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0NjpjYXNlIDEwMTpjYXNlIDY5OmNhc2UgNDM6Y2FzZSA0NTp0aGlzLnN0cmluZys9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjticmVhaztkZWZhdWx0OnRoaXMudFN0YXRlPWpyO3ZhciBhPU51bWJlcih0aGlzLnN0cmluZyk7aWYoaXNOYU4oYSkpcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy5zdHJpbmcubWF0Y2goL1swLTldKy8pPT10aGlzLnN0cmluZyYmYS50b1N0cmluZygpIT10aGlzLnN0cmluZz90aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpOnRoaXMub25Ub2tlbihPcixhKSx0aGlzLm9mZnNldCs9dGhpcy5zdHJpbmcubGVuZ3RoLTEsdGhpcy5zdHJpbmc9dm9pZCAwLHItLX1lbHNlIGlmKHRoaXMudFN0YXRlPT09Q3Ipe2lmKDExNCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9UHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PVByKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU1yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ncil7aWYoMTAxIT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oa3IsITApLHRoaXMub2Zmc2V0Kz0zfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ccil7aWYoOTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPXhyfWVsc2UgaWYodGhpcy50U3RhdGU9PT14cil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Vcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09VXIpe2lmKDExNSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9SXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUlyKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihSciwhMSksdGhpcy5vZmZzZXQrPTR9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PURyKXtpZigxMTchPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPU5yfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Ocil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Gcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09RnIpe2lmKDEwOCE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKEFyLG51bGwpLHRoaXMub2Zmc2V0Kz0zfX0sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe30sdW4ucGFyc2VFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIithbi50b2tuYW0odCkrKGU/IigiK0pTT04uc3RyaW5naWZ5KGUpKyIpIjoiIikrIiBpbiBzdGF0ZSAiK2FuLnRva25hbSh0aGlzLnN0YXRlKSkpfSx1bi5wdXNoPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wdXNoKHt2YWx1ZTp0aGlzLnZhbHVlLGtleTp0aGlzLmtleSxtb2RlOnRoaXMubW9kZX0pfSx1bi5wb3A9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnZhbHVlPWUudmFsdWUsdGhpcy5rZXk9ZS5rZXksdGhpcy5tb2RlPWUubW9kZSx0aGlzLmVtaXQodCksdGhpcy5tb2RlfHwodGhpcy5zdGF0ZT1Wcil9LHVuLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5tb2RlJiYodGhpcy5zdGF0ZT1FciksdGhpcy5vblZhbHVlKHQpfSx1bi5vblZhbHVlPWZ1bmN0aW9uKHQpe30sdW4ub25Ub2tlbj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RhdGU9PT1WcilpZih0PT09VHJ8fHQ9PT1Pcnx8dD09PWtyfHx0PT09UnJ8fHQ9PT1Bcil0aGlzLnZhbHVlJiYodGhpcy52YWx1ZVt0aGlzLmtleV09ZSksdGhpcy5lbWl0KGUpO2Vsc2UgaWYodD09PWJyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT17fTp0aGlzLnZhbHVlPXt9LHRoaXMua2V5PXZvaWQgMCx0aGlzLnN0YXRlPUtyLHRoaXMubW9kZT1acjtlbHNlIGlmKHQ9PT13cil0aGlzLnB1c2goKSx0aGlzLnZhbHVlP3RoaXMudmFsdWU9dGhpcy52YWx1ZVt0aGlzLmtleV09W106dGhpcy52YWx1ZT1bXSx0aGlzLmtleT0wLHRoaXMubW9kZT1Rcix0aGlzLnN0YXRlPVZyO2Vsc2UgaWYodD09PW1yKXtpZih0aGlzLm1vZGUhPT1acilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNle2lmKHQhPT1fcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7aWYodGhpcy5tb2RlIT09UXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9ZWxzZSBpZih0aGlzLnN0YXRlPT09S3IpaWYodD09PVRyKXRoaXMua2V5PWUsdGhpcy5zdGF0ZT1TcjtlbHNle2lmKHQhPT1tcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1Tcil7aWYodCE9PVNyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnN0YXRlPVZyfWVsc2V7aWYodGhpcy5zdGF0ZSE9PUVyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0PT09RXIpdGhpcy5tb2RlPT09UXI/KHRoaXMua2V5KyssdGhpcy5zdGF0ZT1Wcik6dGhpcy5tb2RlPT09WnImJih0aGlzLnN0YXRlPUtyKTtlbHNle2lmKCEodD09PV9yJiZ0aGlzLm1vZGU9PT1Rcnx8dD09PW1yJiZ0aGlzLm1vZGU9PT1acikpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMucG9wKCl9fX0sYW4uQz12cjt2YXIgaG49YW47ZnVuY3Rpb24gZm4odCxlLHIpe3Q9dHx8ZnVuY3Rpb24odCl7dGhpcy5xdWV1ZSh0KX0sZT1lfHxmdW5jdGlvbigpe3RoaXMucXVldWUobnVsbCl9O2xldCBuPSExLGk9ITEsbz1bXSxzPSExLGE9bmV3IEplO2Z1bmN0aW9uIHUoKXtmb3IoO28ubGVuZ3RoJiYhYS5wYXVzZWQ7KXtsZXQgdD1vLnNoaWZ0KCk7aWYobnVsbD09PXQpcmV0dXJuIGEuZW1pdCgiZW5kIik7YS5lbWl0KCJkYXRhIix0KX19ZnVuY3Rpb24gaCgpe2Eud3JpdGFibGU9ITEsZS5jYWxsKGEpLCFhLnJlYWRhYmxlJiZhLmF1dG9EZXN0cm95JiZhLmRlc3Ryb3koKX1yZXR1cm4gYS5yZWFkYWJsZT1hLndyaXRhYmxlPSEwLGEucGF1c2VkPSExLGEuYXV0b0Rlc3Ryb3k9IShyJiYhMT09PXIuYXV0b0Rlc3Ryb3kpLGEud3JpdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2FsbCh0aGlzLGUpLCFhLnBhdXNlZH0sYS5xdWV1ZT1hLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHN8fChudWxsPT09dCYmKHM9ITApLG8ucHVzaCh0KSx1KCkpLGF9LGEub24oImVuZCIsKGZ1bmN0aW9uKCl7YS5yZWFkYWJsZT0hMSwhYS53cml0YWJsZSYmYS5hdXRvRGVzdHJveSYmQnQubmV4dFRpY2soKGZ1bmN0aW9uKCl7YS5kZXN0cm95KCl9KSl9KSksYS5lbmQ9ZnVuY3Rpb24odCl7aWYoIW4pcmV0dXJuIG49ITAsYXJndW1lbnRzLmxlbmd0aCYmYS53cml0ZSh0KSxoKCksYX0sYS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoIWkpcmV0dXJuIGk9ITAsbj0hMCxvLmxlbmd0aD0wLGEud3JpdGFibGU9YS5yZWFkYWJsZT0hMSxhLmVtaXQoImNsb3NlIiksYX0sYS5wYXVzZT1mdW5jdGlvbigpe2lmKCFhLnBhdXNlZClyZXR1cm4gYS5wYXVzZWQ9ITAsYX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5wYXVzZWQmJihhLnBhdXNlZD0hMSxhLmVtaXQoInJlc3VtZSIpKSx1KCksYS5wYXVzZWR8fGEuZW1pdCgiZHJhaW4iKSxhfSxhfWZuLnRocm91Z2g9Zm47bGV0IGNuPXtwYXJzZTpmdW5jdGlvbih0LGUpe2xldCByLG47ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9lPT09dDp0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5leGVjP3QuZXhlYyhlKToiYm9vbGVhbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQ/dDoiZnVuY3Rpb24iPT10eXBlb2YgdCYmdChlKX1sZXQgbz1uZXcgaG4scz1mbigoZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD1BLmZyb20odCkpLG8ud3JpdGUodCl9KSwoZnVuY3Rpb24odCl7dCYmcy53cml0ZSh0KSxyJiZzLmVtaXQoImhlYWRlciIsciksbiYmcy5lbWl0KCJmb290ZXIiLG4pLHMucXVldWUobnVsbCl9KSk7ZnVuY3Rpb24gYSh0LGUpeyExIT09ciYmKHI9cnx8e30sclt0XT1lKSwhMSE9PW4mJiExPT09ciYmKG49bnx8e30sblt0XT1lKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIi4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIkKiI9PT10P3tlbWl0S2V5OiEwfToiKiI9PT10fHwoIiI9PT10P3tyZWN1cnNlOiEwfTp0KX0pKSksdCYmdC5sZW5ndGh8fCh0PW51bGwpLG8ub25WYWx1ZT1mdW5jdGlvbihuKXtpZih0aGlzLnJvb3R8fChzLnJvb3Q9biksIXQpcmV0dXJuO2xldCBvPTAsdT0wLGg9ITEsZj0hMTtmb3IoO288dC5sZW5ndGg7KXtsZXQgZSxyPXRbb107aWYodSsrLHImJiFyLnJlY3Vyc2Upe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoIWkocixlLmtleSkpcmV0dXJuIHZvaWQgYShlLmtleSxuKTtoPSEhci5lbWl0S2V5LGY9ISFyLmVtaXRQYXRoLG8rK31lbHNle28rKztsZXQgcj10W29dO2lmKCFyKXJldHVybjtmb3IoOzspe2lmKGU9dT09PXRoaXMuc3RhY2subGVuZ3RoP3RoaXM6dGhpcy5zdGFja1t1XSwhZSlyZXR1cm47aWYoaShyLGUua2V5KSl7bysrLE9iamVjdC5pc0Zyb3plbih0aGlzLnN0YWNrW3VdKXx8KHRoaXMuc3RhY2tbdV0udmFsdWU9bnVsbCk7YnJlYWt9YShlLmtleSxuKSx1Kyt9fX1pZihyJiYocy5lbWl0KCJoZWFkZXIiLHIpLHI9ITEpLHUhPT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm47bGV0IGM9dGhpcy5zdGFjay5zbGljZSgxKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmtleX0pKS5jb25jYXQoW3RoaXMua2V5XSksbD1uO251bGwhPWwmJm51bGwhPShsPWU/ZShsLGMpOmwpJiYoKGh8fGYpJiYobD17dmFsdWU6bH0saCYmKGwua2V5PXRoaXMua2V5KSxmJiYobC5wYXRoPWMpKSxzLnF1ZXVlKGwpKSx0aGlzLnZhbHVlJiZkZWxldGUgdGhpcy52YWx1ZVt0aGlzLmtleV07Zm9yKGxldCB0IGluIHRoaXMuc3RhY2spT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdF0pfHwodGhpcy5zdGFja1t0XS52YWx1ZT1udWxsKX0sby5fb25Ub2tlbj1vLm9uVG9rZW4sby5vblRva2VuPWZ1bmN0aW9uKGUscil7by5fb25Ub2tlbihlLHIpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCYmcy5yb290JiYodHx8cy5xdWV1ZShzLnJvb3QpLHMucm9vdD1udWxsKX0sby5vbkVycm9yPWZ1bmN0aW9uKHQpe3QubWVzc2FnZS5pbmRleE9mKCJhdCBwb3NpdGlvbiIpPi0xJiYodC5tZXNzYWdlPSJJbnZhbGlkIEpTT04gKCIrdC5tZXNzYWdlKyIpIikscy5lbWl0KCJlcnJvciIsdCl9LHN9fSxsbj1mdW5jdGlvbih0LGUpe3JldHVybiBsbj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IobGV0IHIgaW4gZSllLmhhc093blByb3BlcnR5KHIpJiYodFtyXT1lW3JdKX0sbG4odCxlKX07bGV0IHBuLGRuPS9bXFwiXHUwMDAwLVx1MDAxZlx1MDA3Zi1cdTAwOWZcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxnbj17IlxiIjoiXFxiIiwiXHQiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24geW4odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbj9wbi5Qcm9taXNlOmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnBpcGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyfSh0KT90Ll9yZWFkYWJsZVN0YXRlLm9iamVjdE1vZGU/cG4uUmVhZGFibGVPYmplY3Q6cG4uUmVhZGFibGVTdHJpbmc6QXJyYXkuaXNBcnJheSh0KT9wbi5BcnJheToib2JqZWN0Ij09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBPYmplY3Q/cG4uT2JqZWN0OnBuLlByaW1pdGl2ZTpwbi5QcmltaXRpdmV9IWZ1bmN0aW9uKHQpe3RbdC5BcnJheT0wXT0iQXJyYXkiLHRbdC5PYmplY3Q9MV09Ik9iamVjdCIsdFt0LlJlYWRhYmxlU3RyaW5nPTJdPSJSZWFkYWJsZVN0cmluZyIsdFt0LlJlYWRhYmxlT2JqZWN0PTNdPSJSZWFkYWJsZU9iamVjdCIsdFt0LlByaW1pdGl2ZT00XT0iUHJpbWl0aXZlIix0W3QuUHJvbWlzZT01XT0iUHJvbWlzZSJ9KHBufHwocG49e30pKTtsZXQgdm49W107dm5bcG4uQXJyYXldPSJbIix2bltwbi5PYmplY3RdPSJ7Iix2bltwbi5SZWFkYWJsZVN0cmluZ109JyInLHZuW3BuLlJlYWRhYmxlT2JqZWN0XT0iWyI7bGV0IGJuPVtdO2JuW3BuLkFycmF5XT0iXSIsYm5bcG4uT2JqZWN0XT0ifSIsYm5bcG4uUmVhZGFibGVTdHJpbmddPSciJyxibltwbi5SZWFkYWJsZU9iamVjdF09Il0iO2xldCBtbj1bXTtmb3IobGV0IHQ9MCxlPU9iamVjdC5lbnRyaWVzKHBuKTt0PGUubGVuZ3RoO3QrKyl7bGV0IHI9ZVt0XSxuPXJbMF0saT1yWzFdOyJudW1iZXIiPT10eXBlb2YgaSYmKG1uW2ldPSJwcm9jZXNzIituKX1mdW5jdGlvbiB3bih0KXtyZXR1cm4gdC5yZXBsYWNlKGRuLChmdW5jdGlvbih0KXtsZXQgZT1nblt0XTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ZToiXFx1Iit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDQsIjAiKX0pKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4nIicrd24odCkrJyInfWZ1bmN0aW9uIFNuKHQsZSl7bGV0IHI9dC5yZWFkKGUpO3JldHVybiBudWxsPT09cj9uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXtsZXQgbj1mdW5jdGlvbigpe3JldHVybiBlKG51bGwpfTt0Lm9uY2UoImVuZCIsbiksdC5vbmNlKCJlcnJvciIsciksdC5vbmNlKCJyZWFkYWJsZSIsKGZ1bmN0aW9uKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixuKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsciksZSh0LnJlYWQoKSl9KSl9KSk6UHJvbWlzZS5yZXNvbHZlKHIpfWZ1bmN0aW9uIEVuKHQpe3JldHVybiB0LnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB5bih0KT09PXBuLlByb21pc2U/RW4odCk6dH0pKX1sZXQga249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbixpKXt2b2lkIDA9PT1pJiYoaT0hMSk7bGV0IG89dC5jYWxsKHRoaXMpfHx0aGlzO28uY3ljbGU9aSxvLnN0YWNrPVtdLG8uZGVwdGg9MCxvLnB1c2hDYWxsZWQ9ITEsby5lbmQ9ITEsby5pc1JlYWRpbmc9ITEsby5yZWFkTW9yZT0hMTtsZXQgcz10eXBlb2YgbjtyZXR1cm4ic3RyaW5nIiE9PXMmJiJudW1iZXIiIT09c3x8KG8uZ2FwPU51bWJlci5pc0Zpbml0ZShuKT8iICIucmVwZWF0KG4pOm4pLE9iamVjdC5hc3NpZ24obyx7dmlzaXRlZDppP25ldyBXZWFrTWFwOm5ldyBXZWFrU2V0LHJlcGxhY2VyRnVuY3Rpb246ciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZyLHJlcGxhY2VyQXJyYXk6QXJyYXkuaXNBcnJheShyKSYmcn0pLHIgaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG8ucmVwbGFjZXJGdW5jdGlvbj1yKSxBcnJheS5pc0FycmF5KHIpJiYoby5yZXBsYWNlckFycmF5PXIpLG8uYWRkVG9TdGFjayhlKSxvfXJldHVybiBmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPXR9bG4odCxlKSx0LnByb3RvdHlwZT1udWxsPT09ZT9PYmplY3QuY3JlYXRlKGUpOihyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuZXcgcil9KGUsdCksZS5wcm90b3R5cGUuY3ljbGVyPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcy52aXNpdGVkLmdldChlKTtpZihyKXJldHVybnskcmVmOnJ9O2xldCBuPXRoaXMucGF0aCgpO3JldHVybiB2b2lkIDAhPT10JiZuLnB1c2godCksbj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIlsiKyhOdW1iZXIuaXNJbnRlZ2VyKHQpP3Q6X24odCkpKyJdIn0pKSx0aGlzLnZpc2l0ZWQuc2V0KGUsbi5sZW5ndGg/IiQiK24uam9pbigiIik6IiQiKSxlfSxlLnByb3RvdHlwZS5hZGRUb1N0YWNrPWZ1bmN0aW9uKHQsZSxyLG4pe2xldCBpLG8scz10aGlzLGE9dDt0aGlzLnJlcGxhY2VyRnVuY3Rpb24mJihhPXRoaXMucmVwbGFjZXJGdW5jdGlvbihlfHxyLGEsdGhpcykpLGEmJmEudG9KU09OIGluc3RhbmNlb2YgRnVuY3Rpb24mJihhPWEudG9KU09OKCkpLChhIGluc3RhbmNlb2YgRnVuY3Rpb258fCJzeW1ib2wiPT10eXBlb2YgdCkmJihhPXZvaWQgMCksdm9pZCAwIT09ZSYmdGhpcy5yZXBsYWNlckFycmF5JiYodGhpcy5yZXBsYWNlckFycmF5LmluY2x1ZGVzKGUpfHwoYT12b2lkIDApKTtsZXQgdT15bihhKTtpZigobiYmbi50eXBlPT09cG4uQXJyYXl8fHZvaWQgMCE9PWEpJiZ1IT09cG4uUHJvbWlzZSYmKG4mJiFuLmZpcnN0JiZ0aGlzLl9wdXNoKCIsIiksbiYmKG4uZmlyc3Q9ITEpKSx2b2lkIDAhPT1hJiZ1IT09cG4uUHJvbWlzZSYmZSYmKHRoaXMuZ2FwP3RoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkrJyInK3duKGUpKyciOiAnKTp0aGlzLl9wdXNoKCciJyt3bihlKSsnIjonKSksdSE9PXBuLlByaW1pdGl2ZSlpZih0aGlzLmN5Y2xlKWE9dGhpcy5jeWNsZXIoZXx8cixhKSx1PXluKGEpO2Vsc2V7aWYodGhpcy52aXNpdGVkLmhhcyhhKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcigiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTiIpLHtyZWFsVmFsdWU6YSxrZXk6ZXx8cn0pO3RoaXMudmlzaXRlZC5hZGQoYSl9IWUmJnI+LTEmJnRoaXMuZGVwdGgmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKTtsZXQgaD12blt1XTtoJiZ0aGlzLl9wdXNoKGgpO2xldCBmPXtrZXk6ZSxpbmRleDpyLHR5cGU6dSxwYXJlbnQ6bix2YWx1ZTphLGZpcnN0OiEwfTtyZXR1cm4gdT09PXBuLk9iamVjdD8odGhpcy5kZXB0aCs9MSxmLnVucmVhZD1PYmplY3Qua2V5cyhhKSxmLmlzRW1wdHk9IWYudW5yZWFkLmxlbmd0aCk6dT09PXBuLkFycmF5Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPWEubGVuZ3RoLGYuYXJyYXlMZW5ndGg9Zi51bnJlYWQsZi5pc0VtcHR5PSFmLnVucmVhZCk6dSE9PXBuLlJlYWRhYmxlU3RyaW5nJiZ1IT09cG4uUmVhZGFibGVPYmplY3R8fCh0aGlzLmRlcHRoKz0xLGEucmVhZGFibGVFbmRlZHx8KG51bGw9PT0oaT1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5lbmRFbWl0dGVkKT90aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBoYXMgZW5kZWQgYmVmb3JlIGl0IHdhcyBzZXJpYWxpemVkLiBBbGwgc3RyZWFtIGRhdGEgaGF2ZSBiZWVuIGxvc3QiKSxhLGV8fHIpOihhLnJlYWRhYmxlRmxvd2luZ3x8KG51bGw9PT0obz1hLl9yZWFkYWJsZVN0YXRlKXx8dm9pZCAwPT09bz92b2lkIDA6by5mbG93aW5nKSkmJihhLnBhdXNlKCksdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJSZWFkYWJsZSBTdHJlYW0gaXMgaW4gZmxvd2luZyBtb2RlLCBkYXRhIG1heSBoYXZlIGJlZW4gbG9zdC4gVHJ5aW5nIHRvIHBhdXNlIHN0cmVhbS4iKSxhLGV8fHIpKSxmLnJlYWRDb3VudD0wLGEub25jZSgiZW5kIiwoZnVuY3Rpb24oKXtmLmVuZD0hMCxzLl9fcmVhZCgpfSkpLGEub25jZSgiZXJyb3IiLChmdW5jdGlvbih0KXtzLmVycm9yPSEwLHMuZW1pdCgiZXJyb3IiLHQpfSkpKSx0aGlzLnN0YWNrLnVuc2hpZnQoZiksZn0sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVN0YWNrPWZ1bmN0aW9uKHQpe2xldCBlPXQudHlwZSxyPWU9PT1wbi5PYmplY3R8fGU9PT1wbi5BcnJheXx8ZT09PXBuLlJlYWRhYmxlU3RyaW5nfHxlPT09cG4uUmVhZGFibGVPYmplY3Q7ZSE9PXBuLlByaW1pdGl2ZSYmKHRoaXMuY3ljbGV8fHRoaXMudmlzaXRlZC5kZWxldGUodC52YWx1ZSksciYmKHRoaXMuZGVwdGgtPTEpKTtsZXQgbj1ibltlXTtyJiYhdC5pc0VtcHR5JiZ0aGlzLmdhcCYmdGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSksbiYmdGhpcy5fcHVzaChuKTtsZXQgaT10aGlzLnN0YWNrLmluZGV4T2YodCk7dGhpcy5zdGFjay5zcGxpY2UoaSwxKX0sZS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSEwLHRoaXMucHVzaCh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlT2JqZWN0PWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24oZSl7bnVsbCE9PWUmJih0LmZpcnN0fHxyLl9wdXNoKCIsIiksdC5maXJzdD0hMSxyLmFkZFRvU3RhY2soZSx2b2lkIDAsdC5yZWFkQ291bnQpLHQucmVhZENvdW50Kz0xKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc09iamVjdD1mdW5jdGlvbih0KXtpZighdC51bnJlYWQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMucmVtb3ZlRnJvbVN0YWNrKHQpO2xldCBlPXQudW5yZWFkLnNoaWZ0KCkscj10LnZhbHVlW2VdO3RoaXMuYWRkVG9TdGFjayhyLGUsdm9pZCAwLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzQXJyYXk9ZnVuY3Rpb24odCl7bGV0IGU9dC51bnJlYWQ7aWYoIWUpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IHI9dC5hcnJheUxlbmd0aC1lLG49dC52YWx1ZVtyXTt0LnVucmVhZC09MSx0aGlzLmFkZFRvU3RhY2sobix2b2lkIDAscix0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10LnZhbHVlKXtsZXQgZSxyPXR5cGVvZiB0LnZhbHVlO3N3aXRjaChyKXtjYXNlInN0cmluZyI6ZT1fbih0LnZhbHVlKTticmVhaztjYXNlIm51bWJlciI6ZT1OdW1iZXIuaXNGaW5pdGUodC52YWx1ZSk/U3RyaW5nKHQudmFsdWUpOiJudWxsIjticmVhaztjYXNlImJvb2xlYW4iOmU9U3RyaW5nKHQudmFsdWUpO2JyZWFrO2Nhc2Uib2JqZWN0Ijp0LnZhbHVlfHwoZT0ibnVsbCIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoJ1Vua25vd24gdHlwZSAiJytyKyciLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKSx7dmFsdWU6dC52YWx1ZX0pfXRoaXMuX3B1c2goZSl9ZWxzZSF0aGlzLnN0YWNrWzFdfHx0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5BcnJheSYmdGhpcy5zdGFja1sxXS50eXBlIT09cG4uUmVhZGFibGVPYmplY3Q/dC5hZGRTZXBhcmF0b3JBZnRlckVuZD0hMTp0aGlzLl9wdXNoKCJudWxsIik7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NSZWFkYWJsZVN0cmluZz1mdW5jdGlvbih0LGUpe2xldCByPXRoaXM7aWYoIXQuZW5kKXJldHVybiBTbih0LnZhbHVlLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QmJnIuX3B1c2god24odC50b1N0cmluZygpKSl9KSk7dGhpcy5yZW1vdmVGcm9tU3RhY2sodCl9LGUucHJvdG90eXBlLnByb2Nlc3NQcm9taXNlPWZ1bmN0aW9uKHQpe2xldCBlPXRoaXM7cmV0dXJuIEVuKHQudmFsdWUpLnRoZW4oKGZ1bmN0aW9uKHIpe2UucmVtb3ZlRnJvbVN0YWNrKHQpLGUuYWRkVG9TdGFjayhyLHQua2V5LHQuaW5kZXgsdC5wYXJlbnQpfSkpfSxlLnByb3RvdHlwZS5wcm9jZXNzU3RhY2tUb3BJdGVtPWZ1bmN0aW9uKHQpe2xldCBlLHI9dGhpcyxuPXRoaXMuc3RhY2tbMF07aWYoIW58fHRoaXMuZXJyb3IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3RyeXtlPXRoaXNbbW5bbi50eXBlXV0obix0KX1jYXRjaCh0KXtyZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKS50aGVuKChmdW5jdGlvbigpezA9PT1yLnN0YWNrLmxlbmd0aCYmKHIuZW5kPSEwLHIuX3B1c2gobnVsbCkpfSkpfSxlLnByb3RvdHlwZS5fX3JlYWQ9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztpZighdGhpcy5pc1JlYWRpbmcmJiF0aGlzLmVycm9yKXJldHVybiB0aGlzLmlzUmVhZGluZz0hMCx0aGlzLnJlYWRNb3JlPSExLHRoaXMucHJvY2Vzc1N0YWNrVG9wSXRlbSh0KS50aGVuKChmdW5jdGlvbigpeyFlLmVuZCYmIWUuZXJyb3ImJihlLnJlYWRNb3JlfHwhZS5wdXNoQ2FsbGVkKT91cigoZnVuY3Rpb24oKXtlLmlzUmVhZGluZz0hMSxlLl9fcmVhZCgpfSkpOmUuaXNSZWFkaW5nPSExfSkpLmNhdGNoKChmdW5jdGlvbih0KXtlLmVycm9yPSEwLGUuZW1pdCgiZXJyb3IiLHQpfSkpO3RoaXMucmVhZE1vcmU9ITB9LGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3RoaXMucHVzaENhbGxlZD0hMSx0aGlzLl9fcmVhZCh0KX0sZS5wcm90b3R5cGUucGF0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YWNrLm1hcCgoZnVuY3Rpb24odCl7bGV0IGU9dC5rZXkscj10LmluZGV4O3JldHVybiBlfHxyfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR8fHQ+LTF9KSkucmV2ZXJzZSgpfSxlfShwZSk7dmFyIFJuPUFycmF5LmlzQXJyYXksQW49Im9iamVjdCI9PXR5cGVvZiBIZSYmSGUmJkhlLk9iamVjdD09PU9iamVjdCYmSGUsVG49Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixPbj1Bbnx8VG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksam49T24uU3ltYm9sLExuPU9iamVjdC5wcm90b3R5cGUsQ249TG4uaGFzT3duUHJvcGVydHksUG49TG4udG9TdHJpbmcsTW49am4/am4udG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBCbj1mdW5jdGlvbih0KXt2YXIgZT1Dbi5jYWxsKHQsTW4pLHI9dFtNbl07dHJ5e3RbTW5dPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIGk9UG4uY2FsbCh0KTtyZXR1cm4gbiYmKGU/dFtNbl09cjpkZWxldGUgdFtNbl0pLGl9LHhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFVuPWZ1bmN0aW9uKHQpe3JldHVybiB4bi5jYWxsKHQpfSxJbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIERuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkluJiZJbiBpbiBPYmplY3QodCk/Qm4odCk6VW4odCl9O3ZhciBObj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fTt2YXIgRm49ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxObih0KSYmIltvYmplY3QgU3ltYm9sXSI9PURuKHQpfSx6bj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxxbj0vXlx3KiQvO3ZhciBZbj1mdW5jdGlvbih0LGUpe2lmKFJuKHQpKXJldHVybiExO3ZhciByPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPXImJiJzeW1ib2wiIT1yJiYiYm9vbGVhbiIhPXImJm51bGwhPXQmJiFGbih0KSl8fChxbi50ZXN0KHQpfHwhem4udGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBPYmplY3QoZSkpfTt2YXIgV249ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9O3ZhciAkbixHbj1mdW5jdGlvbih0KXtpZighV24odCkpcmV0dXJuITE7dmFyIGU9RG4odCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSxKbj1PblsiX19jb3JlLWpzX3NoYXJlZF9fIl0sSG49KCRuPS9bXi5dKyQvLmV4ZWMoSm4mJkpuLmtleXMmJkpuLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIiskbjoiIjt2YXIgVm49ZnVuY3Rpb24odCl7cmV0dXJuISFIbiYmSG4gaW4gdH0sS249RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBabj1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEtuLmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifSxRbj0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxYbj1GdW5jdGlvbi5wcm90b3R5cGUsdGk9T2JqZWN0LnByb3RvdHlwZSxlaT1Ybi50b1N0cmluZyxyaT10aS5oYXNPd25Qcm9wZXJ0eSxuaT1SZWdFeHAoIl4iK2VpLmNhbGwocmkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3ZhciBpaT1mdW5jdGlvbih0KXtyZXR1cm4hKCFXbih0KXx8Vm4odCkpJiYoR24odCk/bmk6UW4pLnRlc3QoWm4odCkpfTt2YXIgb2k9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX07dmFyIHNpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9b2kodCxlKTtyZXR1cm4gaWkocik/cjp2b2lkIDB9LGFpPXNpKE9iamVjdCwiY3JlYXRlIik7dmFyIHVpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1haT9haShudWxsKTp7fSx0aGlzLnNpemU9MH07dmFyIGhpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxmaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBjaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGFpKXt2YXIgcj1lW3RdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PXI/dm9pZCAwOnJ9cmV0dXJuIGZpLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sbGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgcGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gYWk/dm9pZCAwIT09ZVt0XTpsaS5jYWxsKGUsdCl9O3ZhciBkaT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09YWkmJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc307ZnVuY3Rpb24gZ2kodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19Z2kucHJvdG90eXBlLmNsZWFyPXVpLGdpLnByb3RvdHlwZS5kZWxldGU9aGksZ2kucHJvdG90eXBlLmdldD1jaSxnaS5wcm90b3R5cGUuaGFzPXBpLGdpLnByb3RvdHlwZS5zZXQ9ZGk7dmFyIHlpPWdpO3ZhciB2aT1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9O3ZhciBiaT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX07dmFyIG1pPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoO3ItLTspaWYoYmkodFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX0sd2k9QXJyYXkucHJvdG90eXBlLnNwbGljZTt2YXIgX2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIShyPDApJiYocj09ZS5sZW5ndGgtMT9lLnBvcCgpOndpLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX07dmFyIFNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1taShlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19O3ZhciBFaT1mdW5jdGlvbih0KXtyZXR1cm4gbWkodGhpcy5fX2RhdGFfXyx0KT4tMX07dmFyIGtpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXyxuPW1pKHIsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltuXVsxXT1lLHRoaXN9O2Z1bmN0aW9uIFJpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fVJpLnByb3RvdHlwZS5jbGVhcj12aSxSaS5wcm90b3R5cGUuZGVsZXRlPV9pLFJpLnByb3RvdHlwZS5nZXQ9U2ksUmkucHJvdG90eXBlLmhhcz1FaSxSaS5wcm90b3R5cGUuc2V0PWtpO3ZhciBBaT1SaSxUaT1zaShPbiwiTWFwIik7dmFyIE9pPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgeWksbWFwOm5ldyhUaXx8QWkpLHN0cmluZzpuZXcgeWl9fTt2YXIgamk9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIExpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gamkoZSk/clsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpyLm1hcH07dmFyIENpPWZ1bmN0aW9uKHQpe3ZhciBlPUxpKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9O3ZhciBQaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5nZXQodCl9O3ZhciBNaT1mdW5jdGlvbih0KXtyZXR1cm4gTGkodGhpcyx0KS5oYXModCl9O3ZhciBCaT1mdW5jdGlvbih0LGUpe3ZhciByPUxpKHRoaXMsdCksbj1yLnNpemU7cmV0dXJuIHIuc2V0KHQsZSksdGhpcy5zaXplKz1yLnNpemU9PW4/MDoxLHRoaXN9O2Z1bmN0aW9uIHhpKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXhpLnByb3RvdHlwZS5jbGVhcj1PaSx4aS5wcm90b3R5cGUuZGVsZXRlPUNpLHhpLnByb3RvdHlwZS5nZXQ9UGkseGkucHJvdG90eXBlLmhhcz1NaSx4aS5wcm90b3R5cGUuc2V0PUJpO3ZhciBVaT14aTtmdW5jdGlvbiBJaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgbj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxuKTpuWzBdLG89ci5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLG4pO3JldHVybiByLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIHIuY2FjaGU9bmV3KElpLkNhY2hlfHxVaSkscn1JaS5DYWNoZT1VaTt2YXIgRGk9SWk7dmFyIE5pPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLEZpPS9cXChcXCk/L2csemk9ZnVuY3Rpb24odCl7dmFyIGU9RGkodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PXIuc2l6ZSYmci5jbGVhcigpLHR9KSkscj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShOaSwoZnVuY3Rpb24odCxyLG4saSl7ZS5wdXNoKG4/aS5yZXBsYWNlKEZpLCIkMSIpOnJ8fHQpfSkpLGV9KSk7dmFyIHFpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkobik7KytyPG47KWlbcl09ZSh0W3JdLHIsdCk7cmV0dXJuIGl9LFlpPWpuP2puLnByb3RvdHlwZTp2b2lkIDAsV2k9WWk/WWkudG9TdHJpbmc6dm9pZCAwO3ZhciAkaT1mdW5jdGlvbiB0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihSbihlKSlyZXR1cm4gcWkoZSx0KSsiIjtpZihGbihlKSlyZXR1cm4gV2k/V2kuY2FsbChlKToiIjt2YXIgcj1lKyIiO3JldHVybiIwIj09ciYmMS9lPT0tSW5maW5pdHk/Ii0wIjpyfTt2YXIgR2k9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/IiI6JGkodCl9O3ZhciBKaT1mdW5jdGlvbih0LGUpe3JldHVybiBSbih0KT90OlluKHQsZSk/W3RdOnppKEdpKHQpKX07dmFyIEhpPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8Rm4odCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LUluZmluaXR5PyItMCI6ZX07dmFyIFZpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsbj0oZT1KaShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxuOyl0PXRbSGkoZVtyKytdKV07cmV0dXJuIHImJnI9PW4/dDp2b2lkIDB9O3ZhciBLaT1mdW5jdGlvbih0LGUscil7dmFyIG49bnVsbD09dD92b2lkIDA6VmkodCxlKTtyZXR1cm4gdm9pZCAwPT09bj9yOm59O3ZhciBaaT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBOdW1iZXJdIj09RG4odCl9O2Z1bmN0aW9uIFFpKHQpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIFhpKHQpe3JldHVybiEoIVFpKHQpfHwiIj09PXQpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gZW8odCl7cmV0dXJuIltvYmplY3QgVW5kZWZpbmVkXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gcm8odCl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbm8odCl7cmV0dXJuISghUWkodCl8fCIiIT09dCl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuISFlbyh0KXx8KCEhZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVsbF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSh0KXx8KCEhZnVuY3Rpb24odCl7aWYocm8odCkpe2ZvcihsZXQgZSBpbiB0KXJldHVybiExO3JldHVybiEwfXJldHVybiExfSh0KXx8KCEhbm8odCl8fCEhZnVuY3Rpb24odCl7cmV0dXJuISF0byh0KSYmMD09PXQubGVuZ3RofSh0KSkpKX1mdW5jdGlvbiBvbygpe2xldCB0LGUscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oKXt0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXX0pKTtyZXR1cm4gci5yZXNvbHZlPXQsci5yZWplY3Q9ZSxyfWxldCBXSnNvblN0cmVhbT17cGFyc2U6YXN5bmMgZnVuY3Rpb24odCl7aWYoIVhpKHQpKXJldHVybnt9O2xldCBlPXt9O3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7ZT17fX1yZXR1cm4gZX0scGFyc2VCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT17fTtpZigibnVsbCI9PT10KXJldHVybiBudWxsO2lmKCIiPT09dClyZXR1cm57fTtsZXQgcj0iX19zeXN0ZW1fXyIsbj1geyJfX3N5c3RlbV9fIjoke3R9fWAsaT1vbygpLG89eXIobikscz1jbi5wYXJzZSgiJCoiKTtyZXR1cm4gcy5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2VbdC5rZXldPXQudmFsdWV9KSkscy5vbigiZW5kIiwoZnVuY3Rpb24oKXtsZXQgdD1LaShlLHIpO2kucmVzb2x2ZSh0KX0pKSxzLm9uKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2kucmVqZWN0KHQpfSkpLG8ucGlwZShzKSxpfSxjcmVhdGVQYXJzZVN0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gWGkodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEoIXRvKHQpfHwwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aCYmaW8odFswXSkpfSh0KXx8KHQ9IiQqIiksY24ucGFyc2UodCl9LHN0cmluZ2lmeTphc3luYyBmdW5jdGlvbih0KXtpZihlbyh0KSlyZXR1cm4iIjtsZXQgZT0iIjt0cnl7ZT1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtlPSIifXJldHVybiBlfSxzdHJpbmdpZnlCeVN0cmVhbTpmdW5jdGlvbih0KXtsZXQgZT0iIjtpZihlbyh0KSlyZXR1cm4iIjtpZihudWxsPT09dClyZXR1cm4ibnVsbCI7aWYobm8odCkpcmV0dXJuJyIiJztpZihaaSh0KSlyZXR1cm5gJHt0fWA7aWYoUWkodCkpcmV0dXJuYCIke3R9ImA7bGV0IHI9b28oKSxuPW5ldyBrbih0LG51bGwsbnVsbCwhMSk7cmV0dXJuIG4ub24oImRhdGEiLChmdW5jdGlvbih0KXtlKz10fSkpLG4ub24oImVuZCIsKGZ1bmN0aW9uKCl7ci5yZXNvbHZlKGUpfSkpLG4ub24oImVycm9yIiwoZnVuY3Rpb24odCl7ci5yZWplY3QodCl9KSkscn0sY3JlYXRlU3RyaW5naWZ5U3RyZWFtOmZ1bmN0aW9uKHQpe2lmKCFybyh0KSYmIXRvKHQpKXRocm93IG5ldyBFcnJvcigiZGF0YSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5Iik7cmV0dXJuIG5ldyBrbih0LG51bGwsbnVsbCwhMSl9fTsKCmxldCBpbnN0YW5jZSA9IG51bGwKZnVuY3Rpb24gaW5pdChpbnB1dCl7CgogICAgLy9pbml0CiAgICBsZXQgcgogICAgCiAgICAgICAgciA9IFdKc29uU3RyZWFtKC4uLmlucHV0KQogICAgICAgIAoKICAgIC8vb24KICAgIAoKICAgIC8vc2F2ZQogICAgaW5zdGFuY2UgPSByCgp9CgpmdW5jdGlvbiBzZW5kTWVzc2FnZShkYXRhKSB7CiAgICAKICAgICAgICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKGRhdGEpCiAgICAgICAgCn0KCmFzeW5jIGZ1bmN0aW9uIHJ1bihkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJ1bicsZGF0YSkKCiAgICAvL21vZGUKICAgIGxldCBtb2RlID0gZGF0YS5tb2RlCgogICAgLy9jaGVjawogICAgaWYobW9kZSAhPT0gJ2luaXQnICYmIG1vZGUgIT09ICdjYWxsJyl7CiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgLy9pbml0CiAgICBpZihtb2RlID09PSAnaW5pdCcpewogICAgICAgIAogICAgICAgIHRyeXsKCiAgICAgICAgICAgIC8vdHlwZQogICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGEudHlwZQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CiAgICAKICAgICAgICAgICAgLy9pbnN0YW5jZQogICAgICAgICAgICBpZih0eXBlID09PSAnZnVuY3Rpb24nKXsKICAgICAgICAgICAgICAgIGluaXQoLi4uaW5wdXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZih0eXBlID09PSAnb2JqZWN0Jyl7CiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFdKc29uU3RyZWFtCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGNhdGNoKGVycil7CiAgICAgICAgCiAgICAgICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgICAgIG1vZGU6ICdlbWl0JywKICAgICAgICAgICAgICAgIGV2TmFtZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1zZzogZXJyLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICAgICAgfQogICAgICAgICAgICAKICAgIH0KCiAgICAvL2NoZWNrCiAgICBpZihtb2RlID09PSAnY2FsbCcpewogICAgICAgIGxldCBzdGF0ZSA9ICcnCiAgICAgICAgbGV0IG1zZyA9IG51bGwKCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy9mdW4KICAgICAgICAgICAgbGV0IGZ1biA9IGluc3RhbmNlW2RhdGEuZnVuXQoKICAgICAgICAgICAgLy9pbnB1dAogICAgICAgICAgICBsZXQgaW5wdXQgPSBkYXRhLmlucHV0CgogICAgICAgICAgICAvL2V4ZWMKICAgICAgICAgICAgYXdhaXQgZnVuKC4uLmlucHV0KQogICAgICAgICAgICAgICAgLnRoZW4oKHN1YykgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdzdWNjZXNzJwogICAgICAgICAgICAgICAgICAgIG1zZz1zdWMKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlPSdlcnJvcicKICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAgICAgc3RhdGUgPSAnZXJyb3InCiAgICAgICAgICAgIG1zZyA9IGVycgogICAgICAgIH0KICAgICAgICAKICAgICAgICAvL3NlbmRNZXNzYWdlCiAgICAgICAgbGV0IHJlcyA9IHsKICAgICAgICAgICAgbW9kZTogJ3JldHVybicsCiAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICBmdW46IGRhdGEuZnVuLAogICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgbXNnLAogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZShyZXMpCgogICAgfQoKfQoKZnVuY3Rpb24gcmVjdk1lc3NhZ2UoZGF0YSkgewogICAgLy8gY29uc29sZS5sb2coJ2lubmVyIHdvcmtlciByZWN2OicsIGRhdGEpCgogICAgLy9kYXRhUmVjdgogICAgbGV0IGRhdGFSZWN2ID0gZGF0YQoKICAgIC8vcnVuCiAgICBydW4oZGF0YVJlY3YpCgp9CgoKICAgICAgICBwYXJlbnRQb3J0Lm9uKCdtZXNzYWdlJywgcmVjdk1lc3NhZ2UpCiAgICAgICAgCgo=",Buffer.from(G,"base64").toString("utf8"));function y(){var d=Z();function b(Z){try{return new l.Worker(Z,{eval:!0})}catch(l){p(l)}}var G=b(X);if(!G)return p("invalid worker"),null;function i(){G?(G.terminate(),G=void 0):p("worker has been terminated")}function W(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function u(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(){var l=m(),Z=c(),b={mode:"call",id:Z,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),d.once(Z,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function I(l){var Z=l,m=Z.mode;"emit"!==m&&"return"!==m||("emit"===m&&d.emit(Z.evName,Z.msg),"return"===m&&d.emit(Z.id,Z))}function p(l){d.emit("error",l)}return G.on("message",I),G.on("error",p),W(Array.prototype.slice.call(arguments)),d.stringify=u,d.parse=y,d.terminate=i,d}var I,p,V={stringify:(p=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.stringify.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return p.apply(this,arguments)}),parse:(I=b(W.mark((function l(){var Z,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return Z=Array.prototype.slice.call(b),m=y(),l.next=4,m.parse.apply(m,d(Z)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return I.apply(this,arguments)})};for(var h in i=Z(),V){var a=V[h];i[h]=a}}(),i}(d.default)})),G=c((function(l,Z){l.exports=function(){function l(l,Z){(null==Z||Z>l.length)&&(Z=l.length);for(var d=0,m=new Array(Z);d<Z;d++)m[d]=l[d];return m}function Z(Z){return function(Z){if(Array.isArray(Z))return l(Z)}(Z)||function(l){if("undefined"!=typeof Symbol&&null!=l[Symbol.iterator]||null!=l["@@iterator"])return Array.from(l)}(Z)||function(Z,d){if(Z){if("string"==typeof Z)return l(Z,d);var m=Object.prototype.toString.call(Z).slice(8,-1);return"Object"===m&&Z.constructor&&(m=Z.constructor.name),"Map"===m||"Set"===m?Array.from(Z):"Arguments"===m||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(m)?l(Z,d):void 0}}(Z)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(l,Z,d,m,c,b,G){try{var X=l[b](G),i=X.value}catch(l){return void d(l)}X.done?Z(i):Promise.resolve(i).then(m,c)}function c(l){return function(){var Z=this,m=arguments;return new Promise((function(c,b){var G=l.apply(Z,m);function X(l){d(G,c,b,X,i,"next",l)}function i(l){d(G,c,b,X,i,"throw",l)}X(void 0)}))}}function b(l){return b="function"==typeof Symbol&&"symbol"==m(Symbol.iterator)?function(l){return m(l)}:function(l){return l&&"function"==typeof Symbol&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":m(l)},b(l)}function G(l){var Z={exports:{}};return l(Z,Z.exports),Z.exports}var X,i,W=G((function(l){var Z=function(l){var Z,d=Object.prototype,m=d.hasOwnProperty,c="function"==typeof Symbol?Symbol:{},G=c.iterator||"@@iterator",X=c.asyncIterator||"@@asyncIterator",i=c.toStringTag||"@@toStringTag";function W(l,Z,d){return Object.defineProperty(l,Z,{value:d,enumerable:!0,configurable:!0,writable:!0}),l[Z]}try{W({},"")}catch(l){W=function(l,Z,d){return l[Z]=d}}function u(l,Z,d,m){var c=Z&&Z.prototype instanceof n?Z:n,b=Object.create(c.prototype),G=new x(m||[]);return b._invoke=function(l,Z,d){var m=I;return function(c,b){if(m===V)throw new Error("Generator is already running");if(m===h){if("throw"===c)throw b;return g()}for(d.method=c,d.arg=b;;){var G=d.delegate;if(G){var X=H(G,d);if(X){if(X===a)continue;return X}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if(m===I)throw m=h,d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);m=V;var i=y(l,Z,d);if("normal"===i.type){if(m=d.done?h:p,i.arg===a)continue;return{value:i.arg,done:d.done}}"throw"===i.type&&(m=h,d.method="throw",d.arg=i.arg)}}}(l,d,G),b}function y(l,Z,d){try{return{type:"normal",arg:l.call(Z,d)}}catch(l){return{type:"throw",arg:l}}}l.wrap=u;var I="suspendedStart",p="suspendedYield",V="executing",h="completed",a={};function n(){}function o(){}function K(){}var Y={};W(Y,G,(function(){return this}));var R=Object.getPrototypeOf,L=R&&R(R(T([])));L&&L!==d&&m.call(L,G)&&(Y=L);var s=K.prototype=n.prototype=Object.create(Y);function J(l){["next","throw","return"].forEach((function(Z){W(l,Z,(function(l){return this._invoke(Z,l)}))}))}function t(l,Z){function d(c,G,X,i){var W=y(l[c],l,G);if("throw"!==W.type){var u=W.arg,I=u.value;return I&&"object"===b(I)&&m.call(I,"__await")?Z.resolve(I.__await).then((function(l){d("next",l,X,i)}),(function(l){d("throw",l,X,i)})):Z.resolve(I).then((function(l){u.value=l,X(u)}),(function(l){return d("throw",l,X,i)}))}i(W.arg)}var c;this._invoke=function(l,m){function b(){return new Z((function(Z,c){d(l,m,Z,c)}))}return c=c?c.then(b,b):b()}}function H(l,d){var m=l.iterator[d.method];if(m===Z){if(d.delegate=null,"throw"===d.method){if(l.iterator.return&&(d.method="return",d.arg=Z,H(l,d),"throw"===d.method))return a;d.method="throw",d.arg=new TypeError("The iterator does not provide a 'throw' method")}return a}var c=y(m,l.iterator,d.arg);if("throw"===c.type)return d.method="throw",d.arg=c.arg,d.delegate=null,a;var b=c.arg;return b?b.done?(d[l.resultName]=b.value,d.next=l.nextLoc,"return"!==d.method&&(d.method="next",d.arg=Z),d.delegate=null,a):b:(d.method="throw",d.arg=new TypeError("iterator result is not an object"),d.delegate=null,a)}function S(l){var Z={tryLoc:l[0]};1 in l&&(Z.catchLoc=l[1]),2 in l&&(Z.finallyLoc=l[2],Z.afterLoc=l[3]),this.tryEntries.push(Z)}function C(l){var Z=l.completion||{};Z.type="normal",delete Z.arg,l.completion=Z}function x(l){this.tryEntries=[{tryLoc:"root"}],l.forEach(S,this),this.reset(!0)}function T(l){if(l){var d=l[G];if(d)return d.call(l);if("function"==typeof l.next)return l;if(!isNaN(l.length)){var c=-1,b=function d(){for(;++c<l.length;)if(m.call(l,c))return d.value=l[c],d.done=!1,d;return d.value=Z,d.done=!0,d};return b.next=b}}return{next:g}}function g(){return{value:Z,done:!0}}return o.prototype=K,W(s,"constructor",K),W(K,"constructor",o),o.displayName=W(K,i,"GeneratorFunction"),l.isGeneratorFunction=function(l){var Z="function"==typeof l&&l.constructor;return!!Z&&(Z===o||"GeneratorFunction"===(Z.displayName||Z.name))},l.mark=function(l){return Object.setPrototypeOf?Object.setPrototypeOf(l,K):(l.__proto__=K,W(l,i,"GeneratorFunction")),l.prototype=Object.create(s),l},l.awrap=function(l){return{__await:l}},J(t.prototype),W(t.prototype,X,(function(){return this})),l.AsyncIterator=t,l.async=function(Z,d,m,c,b){void 0===b&&(b=Promise);var G=new t(u(Z,d,m,c),b);return l.isGeneratorFunction(d)?G:G.next().then((function(l){return l.done?l.value:G.next()}))},J(s),W(s,i,"Generator"),W(s,G,(function(){return this})),W(s,"toString",(function(){return"[object Generator]"})),l.keys=function(l){var Z=[];for(var d in l)Z.push(d);return Z.reverse(),function d(){for(;Z.length;){var m=Z.pop();if(m in l)return d.value=m,d.done=!1,d}return d.done=!0,d}},l.values=T,x.prototype={constructor:x,reset:function(l){if(this.prev=0,this.next=0,this.sent=this._sent=Z,this.done=!1,this.delegate=null,this.method="next",this.arg=Z,this.tryEntries.forEach(C),!l)for(var d in this)"t"===d.charAt(0)&&m.call(this,d)&&!isNaN(+d.slice(1))&&(this[d]=Z)},stop:function(){this.done=!0;var l=this.tryEntries[0].completion;if("throw"===l.type)throw l.arg;return this.rval},dispatchException:function(l){if(this.done)throw l;var d=this;function c(m,c){return X.type="throw",X.arg=l,d.next=m,c&&(d.method="next",d.arg=Z),!!c}for(var b=this.tryEntries.length-1;b>=0;--b){var G=this.tryEntries[b],X=G.completion;if("root"===G.tryLoc)return c("end");if(G.tryLoc<=this.prev){var i=m.call(G,"catchLoc"),W=m.call(G,"finallyLoc");if(i&&W){if(this.prev<G.catchLoc)return c(G.catchLoc,!0);if(this.prev<G.finallyLoc)return c(G.finallyLoc)}else if(i){if(this.prev<G.catchLoc)return c(G.catchLoc,!0)}else{if(!W)throw new Error("try statement without catch or finally");if(this.prev<G.finallyLoc)return c(G.finallyLoc)}}}},abrupt:function(l,Z){for(var d=this.tryEntries.length-1;d>=0;--d){var c=this.tryEntries[d];if(c.tryLoc<=this.prev&&m.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var b=c;break}}b&&("break"===l||"continue"===l)&&b.tryLoc<=Z&&Z<=b.finallyLoc&&(b=null);var G=b?b.completion:{};return G.type=l,G.arg=Z,b?(this.method="next",this.next=b.finallyLoc,a):this.complete(G)},complete:function(l,Z){if("throw"===l.type)throw l.arg;return"break"===l.type||"continue"===l.type?this.next=l.arg:"return"===l.type?(this.rval=this.arg=l.arg,this.method="return",this.next="end"):"normal"===l.type&&Z&&(this.next=Z),a},finish:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.finallyLoc===l)return this.complete(d.completion,d.afterLoc),C(d),a}},catch:function(l){for(var Z=this.tryEntries.length-1;Z>=0;--Z){var d=this.tryEntries[Z];if(d.tryLoc===l){var m=d.completion;if("throw"===m.type){var c=m.arg;C(d)}return c}}throw new Error("illegal catch attempt")},delegateYield:function(l,d,m){return this.delegate={iterator:T(l),resultName:d,nextLoc:m},"next"===this.method&&(this.arg=Z),a}},l}(l.exports);try{regeneratorRuntime=Z}catch(l){"object"===("undefined"==typeof globalThis?"undefined":b(globalThis))?globalThis.regeneratorRuntime=Z:Function("r","regeneratorRuntime = r")(Z)}})),u="function"==typeof atob,y="function"==typeof Buffer,I="function"==typeof TextDecoder?new TextDecoder:void 0,p=("function"==typeof TextEncoder&&new TextEncoder,Array.prototype.slice.call("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=")),V=(X={},p.forEach((function(l,Z){return X[l]=Z})),X),h=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,a=String.fromCharCode.bind(String),n="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):function(l){var Z=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(l){return l};return new Uint8Array(Array.prototype.slice.call(l,0).map(Z))},o=function(l){return l.replace(/[^A-Za-z0-9\+\/]/g,"")},K=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,Y=function(l){switch(l.length){case 4:var Z=((7&l.charCodeAt(0))<<18|(63&l.charCodeAt(1))<<12|(63&l.charCodeAt(2))<<6|63&l.charCodeAt(3))-65536;return a(55296+(Z>>>10))+a(56320+(1023&Z));case 3:return a((15&l.charCodeAt(0))<<12|(63&l.charCodeAt(1))<<6|63&l.charCodeAt(2));default:return a((31&l.charCodeAt(0))<<6|63&l.charCodeAt(1))}},R=function(l){return l.replace(K,Y)},L=function(l){if(l=l.replace(/\s+/g,""),!h.test(l))throw new TypeError("malformed base64.");l+="==".slice(2-(3&l.length));for(var Z,d,m,c="",b=0;b<l.length;)Z=V[l.charAt(b++)]<<18|V[l.charAt(b++)]<<12|(d=V[l.charAt(b++)])<<6|(m=V[l.charAt(b++)]),c+=64===d?a(Z>>16&255):64===m?a(Z>>16&255,Z>>8&255):a(Z>>16&255,Z>>8&255,255&Z);return c},s=u?function(l){return atob(o(l))}:y?function(l){return Buffer.from(l,"base64").toString("binary")}:L,J=y?function(l){return n(Buffer.from(l,"base64"))}:function(l){return n(s(l),(function(l){return l.charCodeAt(0)}))},t=y?function(l){return Buffer.from(l,"base64").toString("utf8")}:I?function(l){return I.decode(J(l))}:function(l){return R(s(l))},H=function(l){return o(l.replace(/[-_]/g,(function(l){return"-"==l?"+":"/"})))},S=function(l){return t(H(l))},C=S,x=G((function(l){var Z=Object.prototype.hasOwnProperty,d="~";function m(){}function c(l,Z,d){this.fn=l,this.context=Z,this.once=d||!1}function b(l,Z,m,b,G){if("function"!=typeof m)throw new TypeError("The listener must be a function");var X=new c(m,b||l,G),i=d?d+Z:Z;return l._events[i]?l._events[i].fn?l._events[i]=[l._events[i],X]:l._events[i].push(X):(l._events[i]=X,l._eventsCount++),l}function G(l,Z){0==--l._eventsCount?l._events=new m:delete l._events[Z]}function X(){this._events=new m,this._eventsCount=0}Object.create&&(m.prototype=Object.create(null),(new m).__proto__||(d=!1)),X.prototype.eventNames=function(){var l,m,c=[];if(0===this._eventsCount)return c;for(m in l=this._events)Z.call(l,m)&&c.push(d?m.slice(1):m);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},X.prototype.listeners=function(l){var Z=d?d+l:l,m=this._events[Z];if(!m)return[];if(m.fn)return[m.fn];for(var c=0,b=m.length,G=new Array(b);c<b;c++)G[c]=m[c].fn;return G},X.prototype.listenerCount=function(l){var Z=d?d+l:l,m=this._events[Z];return m?m.fn?1:m.length:0},X.prototype.emit=function(l,Z,m,c,b,G){var X=d?d+l:l;if(!this._events[X])return!1;var i,W,u=this._events[X],y=arguments.length;if(u.fn){switch(u.once&&this.removeListener(l,u.fn,void 0,!0),y){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,Z),!0;case 3:return u.fn.call(u.context,Z,m),!0;case 4:return u.fn.call(u.context,Z,m,c),!0;case 5:return u.fn.call(u.context,Z,m,c,b),!0;case 6:return u.fn.call(u.context,Z,m,c,b,G),!0}for(W=1,i=new Array(y-1);W<y;W++)i[W-1]=arguments[W];u.fn.apply(u.context,i)}else{var I,p=u.length;for(W=0;W<p;W++)switch(u[W].once&&this.removeListener(l,u[W].fn,void 0,!0),y){case 1:u[W].fn.call(u[W].context);break;case 2:u[W].fn.call(u[W].context,Z);break;case 3:u[W].fn.call(u[W].context,Z,m);break;case 4:u[W].fn.call(u[W].context,Z,m,c);break;default:if(!i)for(I=1,i=new Array(y-1);I<y;I++)i[I-1]=arguments[I];u[W].fn.apply(u[W].context,i)}}return!0},X.prototype.on=function(l,Z,d){return b(this,l,Z,d,!1)},X.prototype.once=function(l,Z,d){return b(this,l,Z,d,!0)},X.prototype.removeListener=function(l,Z,m,c){var b=d?d+l:l;if(!this._events[b])return this;if(!Z)return G(this,b),this;var X=this._events[b];if(X.fn)X.fn!==Z||c&&!X.once||m&&X.context!==m||G(this,b);else{for(var i=0,W=[],u=X.length;i<u;i++)(X[i].fn!==Z||c&&!X[i].once||m&&X[i].context!==m)&&W.push(X[i]);W.length?this._events[b]=1===W.length?W[0]:W:G(this,b)}return this},X.prototype.removeAllListeners=function(l){var Z;return l?(Z=d?d+l:l,this._events[Z]&&G(this,Z)):(this._events=new m,this._eventsCount=0),this},X.prototype.off=X.prototype.removeListener,X.prototype.addListener=X.prototype.on,X.prefixed=d,X.EventEmitter=X,l.exports=X}));return function(){if("browser"!=("undefined"!=typeof window&&void 0!==window.document?"browser":"nodejs"))return null;function l(){return new x}function d(){var l,Z,d=new Promise((function(){l=arguments[0],Z=arguments[1]}));return d.resolve=l,d.reject=Z,d}function m(){for(var l=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,Z=[],d="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),m=d.length,c=0;c<l;c++)Z[c]=d[0|Math.random()*m];return Z.join("")}var b=C("CgoKZnVuY3Rpb24gdCgpe31mdW5jdGlvbiBlKCl7ZS5pbml0LmNhbGwodGhpcyl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdm9pZCAwPT09dC5fbWF4TGlzdGVuZXJzP2UuZGVmYXVsdE1heExpc3RlbmVyczp0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gbih0LGUscil7aWYoZSl0LmNhbGwocik7ZWxzZSBmb3IodmFyIG49dC5sZW5ndGgsaT1jKHQsbiksbz0wO288bjsrK28paVtvXS5jYWxsKHIpfWZ1bmN0aW9uIGkodCxlLHIsbil7aWYoZSl0LmNhbGwocixuKTtlbHNlIGZvcih2YXIgaT10Lmxlbmd0aCxvPWModCxpKSxzPTA7czxpOysrcylvW3NdLmNhbGwocixuKX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7aWYoZSl0LmNhbGwocixuLGkpO2Vsc2UgZm9yKHZhciBvPXQubGVuZ3RoLHM9Yyh0LG8pLGE9MDthPG87KythKXNbYV0uY2FsbChyLG4saSl9ZnVuY3Rpb24gcyh0LGUscixuLGksbyl7aWYoZSl0LmNhbGwocixuLGksbyk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgsYT1jKHQscyksdT0wO3U8czsrK3UpYVt1XS5jYWxsKHIsbixpLG8pfWZ1bmN0aW9uIGEodCxlLHIsbil7aWYoZSl0LmFwcGx5KHIsbik7ZWxzZSBmb3IodmFyIGk9dC5sZW5ndGgsbz1jKHQsaSkscz0wO3M8aTsrK3Mpb1tzXS5hcHBseShyLG4pfWZ1bmN0aW9uIHUoZSxuLGksbyl7dmFyIHMsYSx1LGg7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtpZigoYT1lLl9ldmVudHMpPyhhLm5ld0xpc3RlbmVyJiYoZS5lbWl0KCJuZXdMaXN0ZW5lciIsbixpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksYT1lLl9ldmVudHMpLHU9YVtuXSk6KGE9ZS5fZXZlbnRzPW5ldyB0LGUuX2V2ZW50c0NvdW50PTApLHUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1P3U9YVtuXT1vP1tpLHVdOlt1LGldOm8/dS51bnNoaWZ0KGkpOnUucHVzaChpKSwhdS53YXJuZWQmJihzPXIoZSkpJiZzPjAmJnUubGVuZ3RoPnMpe3Uud2FybmVkPSEwO3ZhciBmPW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK3UubGVuZ3RoKyIgIituKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2YubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixmLmVtaXR0ZXI9ZSxmLnR5cGU9bixmLmNvdW50PXUubGVuZ3RoLGg9ZiwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS53YXJuP2NvbnNvbGUud2FybihoKTpjb25zb2xlLmxvZyhoKX19ZWxzZSB1PWFbbl09aSwrK2UuX2V2ZW50c0NvdW50O3JldHVybiBlfWZ1bmN0aW9uIGgodCxlLHIpe3ZhciBuPSExO2Z1bmN0aW9uIGkoKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSksbnx8KG49ITAsci5hcHBseSh0LGFyZ3VtZW50cykpfXJldHVybiBpLmxpc3RlbmVyPXIsaX1mdW5jdGlvbiBmKHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlKXt2YXIgcj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiAxO2lmKHIpcmV0dXJuIHIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W2VdO3JldHVybiByfXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobnVsbCksZS5FdmVudEVtaXR0ZXI9ZSxlLnVzaW5nRG9tYWlucz0hMSxlLnByb3RvdHlwZS5kb21haW49dm9pZCAwLGUucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLGUucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLGUuZGVmYXVsdE1heExpc3RlbmVycz0xMCxlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpbj1udWxsLGUudXNpbmdEb21haW5zJiZ1bmRlZmluZWQuYWN0aXZlLHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9bmV3IHQsdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxlLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHx0PDB8fGlzTmFOKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJuIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LGUucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiByKHRoaXMpfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxoLGYsYyxsLHA9ImVycm9yIj09PXQ7aWYoYz10aGlzLl9ldmVudHMpcD1wJiZudWxsPT1jLmVycm9yO2Vsc2UgaWYoIXApcmV0dXJuITE7aWYobD10aGlzLmRvbWFpbixwKXtpZihlPWFyZ3VtZW50c1sxXSwhbCl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGQ9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGQuY29udGV4dD1lLGR9cmV0dXJuIGV8fChlPW5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkICJlcnJvciIgZXZlbnQnKSksZS5kb21haW5FbWl0dGVyPXRoaXMsZS5kb21haW49bCxlLmRvbWFpblRocm93bj0hMSxsLmVtaXQoImVycm9yIixlKSwhMX1pZighKHI9Y1t0XSkpcmV0dXJuITE7dmFyIGc9ImZ1bmN0aW9uIj09dHlwZW9mIHI7c3dpdGNoKHU9YXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOm4ocixnLHRoaXMpO2JyZWFrO2Nhc2UgMjppKHIsZyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOm8ocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7Y2FzZSA0OnMocixnLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSxhcmd1bWVudHNbM10pO2JyZWFrO2RlZmF1bHQ6Zm9yKGg9bmV3IEFycmF5KHUtMSksZj0xO2Y8dTtmKyspaFtmLTFdPWFyZ3VtZW50c1tmXTthKHIsZyx0aGlzLGgpfXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsdCxlLCExKX0sZS5wcm90b3R5cGUub249ZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIsZS5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodGhpcyx0LGUsITApfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5vbih0LGgodGhpcyx0LGUpKSx0aGlzfSxlLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtyZXR1cm4gdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxoKHRoaXMsdCxlKSksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSxyKXt2YXIgbixpLG8scyxhO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7aWYoIShpPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYoIShuPWlbZV0pKXJldHVybiB0aGlzO2lmKG49PT1yfHxuLmxpc3RlbmVyJiZuLmxpc3RlbmVyPT09cikwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxuLmxpc3RlbmVyfHxyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKG89LTEscz1uLmxlbmd0aDtzLS0gPjA7KWlmKG5bc109PT1yfHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09cil7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7aWYoMT09PW4ubGVuZ3RoKXtpZihuWzBdPXZvaWQgMCwwPT0tLXRoaXMuX2V2ZW50c0NvdW50KXJldHVybiB0aGlzLl9ldmVudHM9bmV3IHQsdGhpcztkZWxldGUgaVtlXX1lbHNlIWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUsbj1yKzEsaT10Lmxlbmd0aDtuPGk7cis9MSxuKz0xKXRbcl09dFtuXTt0LnBvcCgpfShuLG8pO2kucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsYXx8cil9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgcixuO2lmKCEobj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKCFuLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPW5ldyB0LHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0mJigwPT0tLXRoaXMuX2V2ZW50c0NvdW50P3RoaXMuX2V2ZW50cz1uZXcgdDpkZWxldGUgbltlXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBpLG89T2JqZWN0LmtleXMobikscz0wO3M8by5sZW5ndGg7KytzKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3NdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1uZXcgdCx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHI9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpO2Vsc2UgaWYocilkb3t0aGlzLnJlbW92ZUxpc3RlbmVyKGUscltyLmxlbmd0aC0xXSl9d2hpbGUoclswXSk7cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXt2YXIgZSxyPXRoaXMuX2V2ZW50cztyZXR1cm4gciYmKGU9clt0XSk/ImZ1bmN0aW9uIj09dHlwZW9mIGU/W2UubGlzdGVuZXJ8fGVdOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9MDtyPGUubGVuZ3RoOysrcillW3JdPXRbcl0ubGlzdGVuZXJ8fHRbcl07cmV0dXJuIGV9KGUpOltdfSxlLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5saXN0ZW5lckNvdW50P3QubGlzdGVuZXJDb3VudChlKTpmLmNhbGwodCxlKX0sZS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mLGUucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9SZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKTpbXX07dmFyIGw9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxwPVtdLGQ9W10sZz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSx5PSExO2Z1bmN0aW9uIHYoKXt5PSEwO2Zvcih2YXIgdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSlwW2VdPXRbZV0sZFt0LmNoYXJDb2RlQXQoZSldPWU7ZFsiLSIuY2hhckNvZGVBdCgwKV09NjIsZFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gYih0LGUscil7Zm9yKHZhciBuLGksbz1bXSxzPWU7czxyO3MrPTMpbj0odFtzXTw8MTYpKyh0W3MrMV08PDgpK3RbcysyXSxvLnB1c2gocFsoaT1uKT4+MTgmNjNdK3BbaT4+MTImNjNdK3BbaT4+NiY2M10rcFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gbSh0KXt2YXIgZTt5fHx2KCk7Zm9yKHZhciByPXQubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCx1PXItbjthPHU7YSs9cylvLnB1c2goYih0LGEsYStzPnU/dTphK3MpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXBbZT4+Ml0saSs9cFtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXBbZT4+MTBdLGkrPXBbZT4+NCY2M10saSs9cFtlPDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIHcodCxlLHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSx1PSgxPDxhKS0xLGg9dT4+MSxmPS03LGM9cj9pLTE6MCxsPXI/LTE6MSxwPXRbZStjXTtmb3IoYys9bCxvPXAmKDE8PC1mKS0xLHA+Pj0tZixmKz1hO2Y+MDtvPTI1NipvK3RbZStjXSxjKz1sLGYtPTgpO2ZvcihzPW8mKDE8PC1mKS0xLG8+Pj0tZixmKz1uO2Y+MDtzPTI1NipzK3RbZStjXSxjKz1sLGYtPTgpO2lmKDA9PT1vKW89MS1oO2Vsc2V7aWYobz09PXUpcmV0dXJuIHM/TmFOOjEvMCoocD8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPWh9cmV0dXJuKHA/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gXyh0LGUscixuLGksbyl7dmFyIHMsYSx1LGg9OCpvLWktMSxmPSgxPDxoKS0xLGM9Zj4+MSxsPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAscD1uPzA6by0xLGQ9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhhPWlzTmFOKGUpPzE6MCxzPWYpOihzPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKGUrPXMrYz49MT9sL3U6bCpNYXRoLnBvdygyLDEtYykpKnU+PTImJihzKyssdS89MikscytjPj1mPyhhPTAscz1mKTpzK2M+PTE/KGE9KGUqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWMpOihhPWUqTWF0aC5wb3coMixjLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W3IrcF09MjU1JmEscCs9ZCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGgrPWk7aD4wO3RbcitwXT0yNTUmcyxwKz1kLHMvPTI1NixoLT04KTt0W3IrcC1kXXw9MTI4Kmd9dmFyIFM9e30udG9TdHJpbmcsRT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1TLmNhbGwodCl9O2Z1bmN0aW9uIGsoKXtyZXR1cm4gQS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBSKHQsZSl7aWYoaygpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPUEucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IEEoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gQSh0LGUscil7aWYoIShBLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBBKSlyZXR1cm4gbmV3IEEodCxlLHIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gaih0aGlzLHQpfXJldHVybiBUKHRoaXMsdCxlLHIpfWZ1bmN0aW9uIFQodCxlLHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLHIsbil7aWYoZS5ieXRlTGVuZ3RoLHI8MHx8ZS5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKTtBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPUEucHJvdG90eXBlOnQ9TCh0LGUpO3JldHVybiB0fSh0LGUscixuKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFBLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxNKGUsciksaT0odD1SKHQsbikpLndyaXRlKGUscik7aSE9PW4mJih0PXQuc2xpY2UoMCxpKSk7cmV0dXJuIHR9KHQsZSxyKTpmdW5jdGlvbih0LGUpe2lmKFAoZSkpe3ZhciByPTB8QyhlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1SKHQscikpLmxlbmd0aHx8ZS5jb3B5KHQsMCwwLHIpLHR9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChuPWUubGVuZ3RoKSE9bj9SKHQsMCk6TCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZFKGUuZGF0YSkpcmV0dXJuIEwodCxlLmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBPKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gaih0LGUpe2lmKE8oZSksdD1SKHQsZTwwPzA6MHxDKGUpKSwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8ZTsrK3IpdFtyXT0wO3JldHVybiB0fWZ1bmN0aW9uIEwodCxlKXt2YXIgcj1lLmxlbmd0aDwwPzA6MHxDKGUubGVuZ3RoKTt0PVIodCxyKTtmb3IodmFyIG49MDtuPHI7bis9MSl0W25dPTI1NSZlW25dO3JldHVybiB0fWZ1bmN0aW9uIEModCl7aWYodD49aygpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitrKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIFAodCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfWZ1bmN0aW9uIE0odCxlKXtpZihQKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgcj10Lmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBvdCh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHN0KHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIG90KHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEIodCxlLHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gSCh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gJCh0aGlzLGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEcodGhpcyxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEoodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gVyh0aGlzLGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBWKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHgodCxlLHIpe3ZhciBuPXRbZV07dFtlXT10W3JdLHRbcl09bn1mdW5jdGlvbiBVKHQsZSxyLG4saSl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOnQubGVuZ3RoLTEpLHI8MCYmKHI9dC5sZW5ndGgrcikscj49dC5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj10Lmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1BLmZyb20oZSxuKSksUChlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOkkodCxlLHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxyKTpJKHQsW2VdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBJKHQsZSxyLG4saSl7dmFyIG8scz0xLGE9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuIDE9PT1zP3RbZV06dC5yZWFkVUludDE2QkUoZSpzKX1pZihpKXt2YXIgZj0tMTtmb3Iobz1yO288YTtvKyspaWYoaCh0LG8pPT09aChlLC0xPT09Zj8wOm8tZikpe2lmKC0xPT09ZiYmKGY9byksby1mKzE9PT11KXJldHVybiBmKnN9ZWxzZS0xIT09ZiYmKG8tPW8tZiksZj0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgYz0hMCxsPTA7bDx1O2wrKylpZihoKHQsbytsKSE9PWgoZSxsKSl7Yz0hMTticmVha31pZihjKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIEQodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPWUubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludChlLnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO3RbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIE4odCxlLHIsbil7cmV0dXJuIGF0KG90KGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIEYodCxlLHIsbil7cmV0dXJuIGF0KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQocikpO3JldHVybiBlfShlKSx0LHIsbil9ZnVuY3Rpb24geih0LGUscixuKXtyZXR1cm4gRih0LGUscixuKX1mdW5jdGlvbiBxKHQsZSxyLG4pe3JldHVybiBhdChzdChlKSx0LHIsbil9ZnVuY3Rpb24gWSh0LGUscixuKXtyZXR1cm4gYXQoZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrcyluPShyPXQuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBXKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9tKHQpOm0odC5zbGljZShlLHIpKX1mdW5jdGlvbiAkKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIG8scyxhLHUsaD10W2ldLGY9bnVsbCxjPWg+MjM5PzQ6aD4yMjM/MzpoPjE5MT8yOjE7aWYoaStjPD1yKXN3aXRjaChjKXtjYXNlIDE6aDwxMjgmJihmPWgpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89dFtpKzFdKSkmJih1PSgzMSZoKTw8Nnw2MyZvKT4xMjcmJihmPXUpO2JyZWFrO2Nhc2UgMzpvPXRbaSsxXSxzPXRbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmgpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoZj11KTticmVhaztjYXNlIDQ6bz10W2krMV0scz10W2krMl0sYT10W2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmgpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoZj11KX1udWxsPT09Zj8oZj02NTUzMyxjPTEpOmY+NjU1MzUmJihmLT02NTUzNixuLnB1c2goZj4+PjEwJjEwMjN8NTUyOTYpLGY9NTYzMjB8MTAyMyZmKSxuLnB1c2goZiksaSs9Y31yZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdCk7dmFyIHI9IiIsbj0wO2Zvcig7bjxlOylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0LnNsaWNlKG4sbis9NDA5NikpO3JldHVybiByfShuKX1BLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bC5UWVBFRF9BUlJBWV9TVVBQT1JUfHxsLlRZUEVEX0FSUkFZX1NVUFBPUlQsQS5wb29sU2l6ZT04MTkyLEEuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPUEucHJvdG90eXBlLHR9LEEuZnJvbT1mdW5jdGlvbih0LGUscil7cmV0dXJuIFQobnVsbCx0LGUscil9LEEuVFlQRURfQVJSQVlfU1VQUE9SVCYmKEEucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxBLl9fcHJvdG9fXz1VaW50OEFycmF5KSxBLmFsbG9jPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIE8oZSksZTw9MD9SKHQsZSk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/Uih0LGUpLmZpbGwocixuKTpSKHQsZSkuZmlsbChyKTpSKHQsZSl9KG51bGwsdCxlLHIpfSxBLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBqKG51bGwsdCl9LEEuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJighIXQuX2lzQnVmZmVyfHx1dCh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnNsaWNlJiZ1dCh0LnNsaWNlKDAsMCkpfSh0KSl9LEEuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFQKHQpfHwhUChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtyPXRbaV0sbj1lW2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sQS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxBLmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFFKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDt2YXIgbj1BLmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFQKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sQS5ieXRlTGVuZ3RoPU0sQS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLEEucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil4KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpeCh0aGlzLGUsZSszKSx4KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LEEucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl4KHRoaXMsZSxlKzcpLHgodGhpcyxlKzEsZSs2KSx4KHRoaXMsZSsyLGUrNSkseCh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoPyQodGhpcywwLHQpOkIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxBLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PUEuY29tcGFyZSh0aGlzLHQpfSxBLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LEEucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighUCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKHRoaXM9PT10KXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLShlPj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxoPXQuc2xpY2UoZSxyKSxmPTA7ZjxhOysrZilpZih1W2ZdIT09aFtmXSl7bz11W2ZdLHM9aFtmXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LEEucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LEEucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLHIsITApfSxBLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIFUodGhpcyx0LGUsciwhMSl9LEEucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHZvaWQgMD09PWUpbj0idXRmOCIscj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlfD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLWU7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLHQubGVuZ3RoPjAmJihyPDB8fGU8MCl8fGU+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBEKHRoaXMsdCxlLHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIE4odGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEYodGhpcyx0LGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4geih0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIHEodGhpcyx0LGUscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBZKHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LEEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gRyh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEoodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEgodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPWU7bzxyOysrbylpKz1pdCh0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBWKHQsZSxyKXtmb3IodmFyIG49dC5zbGljZShlLHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gSyh0LGUscil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gWih0LGUscixuLGksbyl7aWYoIVAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFEodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPG87KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIFgodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8bzsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gdHQodCxlLHIsbixpLG8pe2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBldCh0LGUscixuLGkpe3JldHVybiBpfHx0dCh0LDAsciw0KSxfKHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIHJ0KHQsZSxyLG4saSl7cmV0dXJuIGl8fHR0KHQsMCxyLDgpLF8odCxlLHIsbiw1Miw4KSxyKzh9QS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSwoZT12b2lkIDA9PT1lP246fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLGU8dCYmKGU9dCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPUEucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O3I9bmV3IEEoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rdF19cmV0dXJuIHJ9LEEucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxLKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLG89MDsrK288ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCtvXSppO3JldHVybiBufSxBLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sQS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxBLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxBLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxLKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sQS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Syh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOyluKz10aGlzW3Qrb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LEEucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fEsodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsbz10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW3QrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCplKSksb30sQS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSxBLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fEsodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sQS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxLKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEEucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LEEucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LEEucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fEsodCw0LHRoaXMubGVuZ3RoKSx3KHRoaXMsdCwhMCwyMyw0KX0sQS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDQsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDIzLDQpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCEwLDUyLDgpfSxBLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Syh0LDgsdGhpcy5sZW5ndGgpLHcodGhpcyx0LCExLDUyLDgpfSxBLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUscixuKXsodD0rdCxlfD0wLHJ8PTAsbil8fFoodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK3J9LEEucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4peyh0PSt0LGV8PTAscnw9MCxuKXx8Wih0aGlzLHQsZSxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwyNTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDIsNjU1MzUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMiw2NTUzNSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpRKHRoaXMsdCxlLCExKSxlKzJ9LEEucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOlgodGhpcyx0LGUsITApLGUrNH0sQS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxBLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6WCh0aGlzLHQsZSwhMSksZSs0fSxBLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Wih0aGlzLHQsZSxyLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxyJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvLTFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1oodGhpcyx0LGUscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYocyo9MjU2KTspdDwwJiYwPT09YSYmMCE9PXRoaXNbZStvKzFdJiYoYT0xKSx0aGlzW2Urb109KHQvcz4+MCktYSYyNTU7cmV0dXJuIGUrcn0sQS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFoodGhpcyx0LGUsMSwxMjcsLTEyOCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxBLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6USh0aGlzLHQsZSwhMCksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6USh0aGlzLHQsZSwhMSksZSsyfSxBLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Wih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLEEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTpYKHRoaXMsdCxlLCEwKSxlKzR9LEEucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxaKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksQS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOlgodGhpcyx0LGUsITEpLGUrNH0sQS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZXQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGV0KHRoaXMsdCxlLCExLHIpfSxBLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcnQodGhpcyx0LGUsITAscil9LEEucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBydCh0aGlzLHQsZSwhMSxyKX0sQS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1vLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhQS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscitvKSxlKTtyZXR1cm4gb30sQS5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhQS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO3ZhciBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXt2YXIgcz1QKHQpP3Q6b3QobmV3IEEodCxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLWU7KytvKXRoaXNbbytlXT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBudD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBpdCh0KXtyZXR1cm4gdDwxNj8iMCIrdC50b1N0cmluZygxNik6dC50b1N0cmluZygxNil9ZnVuY3Rpb24gb3QodCxlKXt2YXIgcjtlPWV8fDEvMDtmb3IodmFyIG49dC5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPXQuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsoZS09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIHN0KHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxvLHM7eXx8digpO3ZhciBhPXQubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09dFthLTJdPzI6Ij0iPT09dFthLTFdPzE6MCxzPW5ldyBnKDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxuO2UrPTQscis9MylpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTh8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGRbdC5jaGFyQ29kZUF0KGUrMildPDw2fGRbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9ZFt0LmNoYXJDb2RlQXQoZSldPDwyfGRbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmaSk6MT09PW8mJihpPWRbdC5jaGFyQ29kZUF0KGUpXTw8MTB8ZFt0LmNoYXJDb2RlQXQoZSsxKV08PDR8ZFt0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaSksc30oZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShudCwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24gYXQodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gdXQodCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiBodCgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGZ0KCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgY3Q9aHQsbHQ9ZnQ7ZnVuY3Rpb24gcHQodCl7aWYoY3Q9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KHQsMCk7aWYoKGN0PT09aHR8fCFjdCkmJnNldFRpbWVvdXQpcmV0dXJuIGN0PXNldFRpbWVvdXQsc2V0VGltZW91dCh0LDApO3RyeXtyZXR1cm4gY3QodCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIGN0LmNhbGwobnVsbCx0LDApfWNhdGNoKGUpe3JldHVybiBjdC5jYWxsKHRoaXMsdCwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBsLnNldFRpbWVvdXQmJihjdD1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbC5jbGVhclRpbWVvdXQmJihsdD1jbGVhclRpbWVvdXQpO3ZhciBkdCxndD1bXSx5dD0hMSx2dD0tMTtmdW5jdGlvbiBidCgpe3l0JiZkdCYmKHl0PSExLGR0Lmxlbmd0aD9ndD1kdC5jb25jYXQoZ3QpOnZ0PS0xLGd0Lmxlbmd0aCYmbXQoKSl9ZnVuY3Rpb24gbXQoKXtpZigheXQpe3ZhciB0PXB0KGJ0KTt5dD0hMDtmb3IodmFyIGU9Z3QubGVuZ3RoO2U7KXtmb3IoZHQ9Z3QsZ3Q9W107Kyt2dDxlOylkdCYmZHRbdnRdLnJ1bigpO3Z0PS0xLGU9Z3QubGVuZ3RofWR0PW51bGwseXQ9ITEsZnVuY3Rpb24odCl7aWYobHQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigobHQ9PT1mdHx8IWx0KSYmY2xlYXJUaW1lb3V0KXJldHVybiBsdD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtsdCh0KX1jYXRjaChlKXt0cnl7cmV0dXJuIGx0LmNhbGwobnVsbCx0KX1jYXRjaChlKXtyZXR1cm4gbHQuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiB3dCh0KXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyllW3ItMV09YXJndW1lbnRzW3JdO2d0LnB1c2gobmV3IF90KHQsZSkpLDEhPT1ndC5sZW5ndGh8fHl0fHxwdChtdCl9ZnVuY3Rpb24gX3QodCxlKXt0aGlzLmZ1bj10LHRoaXMuYXJyYXk9ZX1fdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gU3QoKXt9dmFyIEV0PVN0LGt0PVN0LFJ0PVN0LEF0PVN0LFR0PVN0LE90PVN0LGp0PVN0O3ZhciBMdD1sLnBlcmZvcm1hbmNlfHx7fSxDdD1MdC5ub3d8fEx0Lm1vek5vd3x8THQubXNOb3d8fEx0Lm9Ob3d8fEx0LndlYmtpdE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX07dmFyIFB0PW5ldyBEYXRlO3ZhciBNdCxCdD17bmV4dFRpY2s6d3QsdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpFdCxhZGRMaXN0ZW5lcjprdCxvbmNlOlJ0LG9mZjpBdCxyZW1vdmVMaXN0ZW5lcjpUdCxyZW1vdmVBbGxMaXN0ZW5lcnM6T3QsZW1pdDpqdCxiaW5kaW5nOmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24odCl7dmFyIGU9LjAwMSpDdC5jYWxsKEx0KSxyPU1hdGguZmxvb3IoZSksbj1NYXRoLmZsb29yKGUlMSoxZTkpO3JldHVybiB0JiYoci09dFswXSwobi09dFsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1QdCkvMWUzfX07TXQ9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTpmdW5jdGlvbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9O3ZhciB4dD1NdCxVdD0vJVtzZGolXS9nO2Z1bmN0aW9uIEl0KHQpe2lmKCFWdCh0KSl7Zm9yKHZhciBlPVtdLHI9MDtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWUucHVzaCh6dChhcmd1bWVudHNbcl0pKTtyZXR1cm4gZS5qb2luKCIgIil9cj0xO2Zvcih2YXIgbj1hcmd1bWVudHMsaT1uLmxlbmd0aCxvPVN0cmluZyh0KS5yZXBsYWNlKFV0LChmdW5jdGlvbih0KXtpZigiJSUiPT09dClyZXR1cm4iJSI7aWYocj49aSlyZXR1cm4gdDtzd2l0Y2godCl7Y2FzZSIlcyI6cmV0dXJuIFN0cmluZyhuW3IrK10pO2Nhc2UiJWQiOnJldHVybiBOdW1iZXIobltyKytdKTtjYXNlIiVqIjp0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG5bcisrXSl9Y2F0Y2godCl7cmV0dXJuIltDaXJjdWxhcl0ifWRlZmF1bHQ6cmV0dXJuIHR9fSkpLHM9bltyXTtyPGk7cz1uWysrcl0pSHQocyl8fCFRdChzKT9vKz0iICIrczpvKz0iICIrenQocyk7cmV0dXJuIG99ZnVuY3Rpb24gRHQodCxlKXtpZihLdChsLnByb2Nlc3MpKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBEdCh0LGUpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07aWYoITA9PT1CdC5ub0RlcHJlY2F0aW9uKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihCdC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihlKTtCdC50cmFjZURlcHJlY2F0aW9uP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS5lcnJvcihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19dmFyIE50LEZ0PXt9O2Z1bmN0aW9uIHp0KHQsZSl7dmFyIHI9e3NlZW46W10sc3R5bGl6ZTpZdH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTMmJihyLmRlcHRoPWFyZ3VtZW50c1syXSksYXJndW1lbnRzLmxlbmd0aD49NCYmKHIuY29sb3JzPWFyZ3VtZW50c1szXSksSnQoZSk/ci5zaG93SGlkZGVuPWU6ZSYmbmUocixlKSxLdChyLnNob3dIaWRkZW4pJiYoci5zaG93SGlkZGVuPSExKSxLdChyLmRlcHRoKSYmKHIuZGVwdGg9MiksS3Qoci5jb2xvcnMpJiYoci5jb2xvcnM9ITEpLEt0KHIuY3VzdG9tSW5zcGVjdCkmJihyLmN1c3RvbUluc3BlY3Q9ITApLHIuY29sb3JzJiYoci5zdHlsaXplPXF0KSxXdChyLHQsci5kZXB0aCl9ZnVuY3Rpb24gcXQodCxlKXt2YXIgcj16dC5zdHlsZXNbZV07cmV0dXJuIHI/IhtbIit6dC5jb2xvcnNbcl1bMF0rIm0iK3QrIhtbIit6dC5jb2xvcnNbcl1bMV0rIm0iOnR9ZnVuY3Rpb24gWXQodCxlKXtyZXR1cm4gdH1mdW5jdGlvbiBXdCh0LGUscil7aWYodC5jdXN0b21JbnNwZWN0JiZlJiZlZShlLmluc3BlY3QpJiZlLmluc3BlY3QhPT16dCYmKCFlLmNvbnN0cnVjdG9yfHxlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PWUpKXt2YXIgbj1lLmluc3BlY3Qocix0KTtyZXR1cm4gVnQobil8fChuPVd0KHQsbixyKSksbn12YXIgaT1mdW5jdGlvbih0LGUpe2lmKEt0KGUpKXJldHVybiB0LnN0eWxpemUoInVuZGVmaW5lZCIsInVuZGVmaW5lZCIpO2lmKFZ0KGUpKXt2YXIgcj0iJyIrSlNPTi5zdHJpbmdpZnkoZSkucmVwbGFjZSgvXiJ8IiQvZywiIikucmVwbGFjZSgvJy9nLCJcXCciKS5yZXBsYWNlKC9cXCIvZywnIicpKyInIjtyZXR1cm4gdC5zdHlsaXplKHIsInN0cmluZyIpfWlmKG49ZSwibnVtYmVyIj09dHlwZW9mIG4pcmV0dXJuIHQuc3R5bGl6ZSgiIitlLCJudW1iZXIiKTt2YXIgbjtpZihKdChlKSlyZXR1cm4gdC5zdHlsaXplKCIiK2UsImJvb2xlYW4iKTtpZihIdChlKSlyZXR1cm4gdC5zdHlsaXplKCJudWxsIiwibnVsbCIpfSh0LGUpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMoZSkscz1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbdF09ITB9KSksZX0obyk7aWYodC5zaG93SGlkZGVuJiYobz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksdGUoZSkmJihvLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8by5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gJHQoZSk7aWYoMD09PW8ubGVuZ3RoKXtpZihlZShlKSl7dmFyIGE9ZS5uYW1lPyI6ICIrZS5uYW1lOiIiO3JldHVybiB0LnN0eWxpemUoIltGdW5jdGlvbiIrYSsiXSIsInNwZWNpYWwiKX1pZihadChlKSlyZXR1cm4gdC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwicmVnZXhwIik7aWYoWHQoZSkpcmV0dXJuIHQuc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLCJkYXRlIik7aWYodGUoZSkpcmV0dXJuICR0KGUpfXZhciB1LGgsZj0iIixjPSExLGw9WyJ7IiwifSJdOyh1PWUsQXJyYXkuaXNBcnJheSh1KSYmKGM9ITAsbD1bIlsiLCJdIl0pLGVlKGUpKSYmKGY9IiBbRnVuY3Rpb24iKyhlLm5hbWU/IjogIitlLm5hbWU6IiIpKyJdIik7cmV0dXJuIFp0KGUpJiYoZj0iICIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSxYdChlKSYmKGY9IiAiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwoZSkpLHRlKGUpJiYoZj0iICIrJHQoZSkpLDAhPT1vLmxlbmd0aHx8YyYmMCE9ZS5sZW5ndGg/cjwwP1p0KGUpP3Quc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksInJlZ2V4cCIpOnQuc3R5bGl6ZSgiW09iamVjdF0iLCJzcGVjaWFsIik6KHQuc2Vlbi5wdXNoKGUpLGg9Yz9mdW5jdGlvbih0LGUscixuLGkpe2Zvcih2YXIgbz1bXSxzPTAsYT1lLmxlbmd0aDtzPGE7KytzKWllKGUsU3RyaW5nKHMpKT9vLnB1c2goR3QodCxlLHIsbixTdHJpbmcocyksITApKTpvLnB1c2goIiIpO3JldHVybiBpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cZCskLyl8fG8ucHVzaChHdCh0LGUscixuLGksITApKX0pKSxvfSh0LGUscixzLG8pOm8ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gR3QodCxlLHIscyxuLGMpfSkpLHQuc2Vlbi5wb3AoKSxmdW5jdGlvbih0LGUscil7aWYodC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiXG4iKSx0K2UucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKT42MClyZXR1cm4gclswXSsoIiI9PT1lPyIiOmUrIlxuICIpKyIgIit0LmpvaW4oIixcbiAgIikrIiAiK3JbMV07cmV0dXJuIHJbMF0rZSsiICIrdC5qb2luKCIsICIpKyIgIityWzFdfShoLGYsbCkpOmxbMF0rZitsWzFdfWZ1bmN0aW9uICR0KHQpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSsiXSJ9ZnVuY3Rpb24gR3QodCxlLHIsbixpLG8pe3ZhciBzLGEsdTtpZigodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsaSl8fHt2YWx1ZTplW2ldfSkuZ2V0P2E9dS5zZXQ/dC5zdHlsaXplKCJbR2V0dGVyL1NldHRlcl0iLCJzcGVjaWFsIik6dC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTp1LnNldCYmKGE9dC5zdHlsaXplKCJbU2V0dGVyXSIsInNwZWNpYWwiKSksaWUobixpKXx8KHM9IlsiK2krIl0iKSxhfHwodC5zZWVuLmluZGV4T2YodS52YWx1ZSk8MD8oYT1IdChyKT9XdCh0LHUudmFsdWUsbnVsbCk6V3QodCx1LnZhbHVlLHItMSkpLmluZGV4T2YoIlxuIik+LTEmJihhPW8/YS5zcGxpdCgiXG4iKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIgICIrdH0pKS5qb2luKCJcbiIpLnN1YnN0cigyKToiXG4iK2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iICAgIit0fSkpLmpvaW4oIlxuIikpOmE9dC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxLdChzKSl7aWYobyYmaS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitpKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9dC5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz10LnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIEh0KHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBWdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gWnQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBSZWdFeHBdIj09PXJlKHQpfWZ1bmN0aW9uIFF0KHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIFF0KHQpJiYiW29iamVjdCBEYXRlXSI9PT1yZSh0KX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gUXQodCkmJigiW29iamVjdCBFcnJvcl0iPT09cmUodCl8fHQgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gZWUodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gcmUodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBuZSh0LGUpe2lmKCFlfHwhUXQoZSkpcmV0dXJuIHQ7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLG49ci5sZW5ndGg7bi0tOyl0W3Jbbl1dPWVbcltuXV07cmV0dXJuIHR9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9ZnVuY3Rpb24gb2UoKXt0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXp0LmNvbG9ycz17Ym9sZDpbMSwyMl0saXRhbGljOlszLDIzXSx1bmRlcmxpbmU6WzQsMjRdLGludmVyc2U6WzcsMjddLHdoaXRlOlszNywzOV0sZ3JleTpbOTAsMzldLGJsYWNrOlszMCwzOV0sYmx1ZTpbMzQsMzldLGN5YW46WzM2LDM5XSxncmVlbjpbMzIsMzldLG1hZ2VudGE6WzM1LDM5XSxyZWQ6WzMxLDM5XSx5ZWxsb3c6WzMzLDM5XX0senQuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sb2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZTp0aGlzLmhlYWQ9ZSx0aGlzLnRhaWw9ZSwrK3RoaXMubGVuZ3RofSxvZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6dGhpcy5oZWFkfTswPT09dGhpcy5sZW5ndGgmJih0aGlzLnRhaWw9ZSksdGhpcy5oZWFkPWUsKyt0aGlzLmxlbmd0aH0sb2UucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sb2UucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LG9lLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIGU9dGhpcy5oZWFkLHI9IiIrZS5kYXRhO2U9ZS5uZXh0OylyKz10K2UuZGF0YTtyZXR1cm4gcn0sb2UucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIEEuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGU9QS5hbGxvY1Vuc2FmZSh0Pj4+MCkscj10aGlzLmhlYWQsbj0wO3I7KXIuZGF0YS5jb3B5KGUsbiksbis9ci5kYXRhLmxlbmd0aCxyPXIubmV4dDtyZXR1cm4gZX07dmFyIHNlPUEuaXNFbmNvZGluZ3x8ZnVuY3Rpb24odCl7c3dpdGNoKHQmJnQudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBhZSh0KXtzd2l0Y2godGhpcy5lbmNvZGluZz0odHx8InV0ZjgiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCIiKSxmdW5jdGlvbih0KXtpZih0JiYhc2UodCkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpfSh0KSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjgiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2UidWNzMiI6Y2FzZSJ1dGYxNmxlIjp0aGlzLnN1cnJvZ2F0ZVNpemU9Mix0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWhlO2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnN1cnJvZ2F0ZVNpemU9Myx0aGlzLmRldGVjdEluY29tcGxldGVDaGFyPWZlO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQodGhpcy53cml0ZT11ZSl9dGhpcy5jaGFyQnVmZmVyPW5ldyBBKDYpLHRoaXMuY2hhclJlY2VpdmVkPTAsdGhpcy5jaGFyTGVuZ3RoPTB9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIHQudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gaGUodCl7dGhpcy5jaGFyUmVjZWl2ZWQ9dC5sZW5ndGglMix0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIGZlKHQpe3RoaXMuY2hhclJlY2VpdmVkPXQubGVuZ3RoJTMsdGhpcy5jaGFyTGVuZ3RoPXRoaXMuY2hhclJlY2VpdmVkPzM6MH1hZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiO3RoaXMuY2hhckxlbmd0aDspe3ZhciByPXQubGVuZ3RoPj10aGlzLmNoYXJMZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQ/dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkOnQubGVuZ3RoO2lmKHQuY29weSh0aGlzLmNoYXJCdWZmZXIsdGhpcy5jaGFyUmVjZWl2ZWQsMCxyKSx0aGlzLmNoYXJSZWNlaXZlZCs9cix0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpcmV0dXJuIiI7aWYodD10LnNsaWNlKHIsdC5sZW5ndGgpLCEoKGk9KGU9dGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKSkuY2hhckNvZGVBdChlLmxlbmd0aC0xKSk+PTU1Mjk2JiZpPD01NjMxOSkpe2lmKHRoaXMuY2hhclJlY2VpdmVkPXRoaXMuY2hhckxlbmd0aD0wLDA9PT10Lmxlbmd0aClyZXR1cm4gZTticmVha310aGlzLmNoYXJMZW5ndGgrPXRoaXMuc3Vycm9nYXRlU2l6ZSxlPSIifXRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIodCk7dmFyIG49dC5sZW5ndGg7dGhpcy5jaGFyTGVuZ3RoJiYodC5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLHQubGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkLG4pLG4tPXRoaXMuY2hhclJlY2VpdmVkKTt2YXIgaTtuPShlKz10LnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCxuKSkubGVuZ3RoLTE7aWYoKGk9ZS5jaGFyQ29kZUF0KG4pKT49NTUyOTYmJmk8PTU2MzE5KXt2YXIgbz10aGlzLnN1cnJvZ2F0ZVNpemU7cmV0dXJuIHRoaXMuY2hhckxlbmd0aCs9byx0aGlzLmNoYXJSZWNlaXZlZCs9byx0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsbywwLG8pLHQuY29weSh0aGlzLmNoYXJCdWZmZXIsMCwwLG8pLGUuc3Vic3RyaW5nKDAsbil9cmV0dXJuIGV9LGFlLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg+PTM/Mzp0Lmxlbmd0aDtlPjA7ZS0tKXt2YXIgcj10W3QubGVuZ3RoLWVdO2lmKDE9PWUmJnI+PjU9PTYpe3RoaXMuY2hhckxlbmd0aD0yO2JyZWFrfWlmKGU8PTImJnI+PjQ9PTE0KXt0aGlzLmNoYXJMZW5ndGg9MzticmVha31pZihlPD0zJiZyPj4zPT0zMCl7dGhpcy5jaGFyTGVuZ3RoPTQ7YnJlYWt9fXRoaXMuY2hhclJlY2VpdmVkPWV9LGFlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9IiI7aWYodCYmdC5sZW5ndGgmJihlPXRoaXMud3JpdGUodCkpLHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgcj10aGlzLmNoYXJSZWNlaXZlZCxuPXRoaXMuY2hhckJ1ZmZlcixpPXRoaXMuZW5jb2Rpbmc7ZSs9bi5zbGljZSgwLHIpLnRvU3RyaW5nKGkpfXJldHVybiBlfSxwZS5SZWFkYWJsZVN0YXRlPWxlO3ZhciBjZT1mdW5jdGlvbih0KXtpZihLdChOdCkmJihOdD1CdC5lbnYuTk9ERV9ERUJVR3x8IiIpLHQ9dC50b1VwcGVyQ2FzZSgpLCFGdFt0XSlpZihuZXcgUmVnRXhwKCJcXGIiK3QrIlxcYiIsImkiKS50ZXN0KE50KSl7RnRbdF09ZnVuY3Rpb24oKXt2YXIgZT1JdC5hcHBseShudWxsLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcigiJXMgJWQ6ICVzIix0LDAsZSl9fWVsc2UgRnRbdF09ZnVuY3Rpb24oKXt9O3JldHVybiBGdFt0XX0oInN0cmVhbSIpO2Z1bmN0aW9uIGxlKHQsZSl7dD10fHx7fSx0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsZSBpbnN0YW5jZW9mIEZlJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LnJlYWRhYmxlT2JqZWN0TW9kZSk7dmFyIHI9dC5oaWdoV2F0ZXJNYXJrLG49dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1yfHwwPT09cj9yOm4sdGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrLHRoaXMuYnVmZmVyPW5ldyBvZSx0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLnJhbk91dD0hMSx0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCx0LmVuY29kaW5nJiYodGhpcy5kZWNvZGVyPW5ldyBhZSh0LmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcpfWZ1bmN0aW9uIHBlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHBlKSlyZXR1cm4gbmV3IHBlKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IGxlKHQsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCx0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBkZSh0LGUscixuLGkpe3ZhciBvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9bnVsbDtBLmlzQnVmZmVyKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fG51bGw9PWV8fHQub2JqZWN0TW9kZXx8KHI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gcn0oZSxyKTtpZihvKXQuZW1pdCgiZXJyb3IiLG8pO2Vsc2UgaWYobnVsbD09PXIpZS5yZWFkaW5nPSExLGZ1bmN0aW9uKHQsZSl7aWYoZS5lbmRlZClyZXR1cm47aWYoZS5kZWNvZGVyKXt2YXIgcj1lLmRlY29kZXIuZW5kKCk7ciYmci5sZW5ndGgmJihlLmJ1ZmZlci5wdXNoKHIpLGUubGVuZ3RoKz1lLm9iamVjdE1vZGU/MTpyLmxlbmd0aCl9ZS5lbmRlZD0hMCx5ZSh0KX0odCxlKTtlbHNlIGlmKGUub2JqZWN0TW9kZXx8ciYmci5sZW5ndGg+MClpZihlLmVuZGVkJiYhaSl7dmFyIHM9bmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpO3QuZW1pdCgiZXJyb3IiLHMpfWVsc2UgaWYoZS5lbmRFbWl0dGVkJiZpKXt2YXIgYT1uZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Iik7dC5lbWl0KCJlcnJvciIsYSl9ZWxzZXt2YXIgdTshZS5kZWNvZGVyfHxpfHxufHwocj1lLmRlY29kZXIud3JpdGUociksdT0hZS5vYmplY3RNb2RlJiYwPT09ci5sZW5ndGgpLGl8fChlLnJlYWRpbmc9ITEpLHV8fChlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixyKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6ci5sZW5ndGgsaT9lLmJ1ZmZlci51bnNoaWZ0KHIpOmUuYnVmZmVyLnB1c2gociksZS5uZWVkUmVhZGFibGUmJnllKHQpKSksZnVuY3Rpb24odCxlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCx3dChiZSx0LGUpKX0odCxlKX1lbHNlIGl8fChlLnJlYWRpbmc9ITEpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4hdC5lbmRlZCYmKHQubmVlZFJlYWRhYmxlfHx0Lmxlbmd0aDx0LmhpZ2hXYXRlck1hcmt8fDA9PT10Lmxlbmd0aCl9KGUpfXh0KHBlLGUpLHBlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gci5vYmplY3RNb2RlfHwic3RyaW5nIiE9dHlwZW9mIHR8fChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PUEuZnJvbSh0LGUpLGU9IiIpLGRlKHRoaXMscix0LGUsITEpfSxwZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbih0KXtyZXR1cm4gZGUodGhpcyx0aGlzLl9yZWFkYWJsZVN0YXRlLHQsIiIsITApfSxwZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30scGUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IGFlKHQpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dCx0aGlzfTtmdW5jdGlvbiBnZSh0LGUpe3JldHVybiB0PD0wfHwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/MDplLm9iamVjdE1vZGU/MTp0IT10P2UuZmxvd2luZyYmZS5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDplLmxlbmd0aDoodD5lLmhpZ2hXYXRlck1hcmsmJihlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTgzODg2MDg/dD04Mzg4NjA4Oih0LS0sdHw9dD4+PjEsdHw9dD4+PjIsdHw9dD4+PjQsdHw9dD4+PjgsdHw9dD4+PjE2LHQrKyksdH0odCkpLHQ8PWUubGVuZ3RoP3Q6ZS5lbmRlZD9lLmxlbmd0aDooZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIHllKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7ZS5uZWVkUmVhZGFibGU9ITEsZS5lbWl0dGVkUmVhZGFibGV8fChjZSgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz93dCh2ZSx0KTp2ZSh0KSl9ZnVuY3Rpb24gdmUodCl7Y2UoImVtaXQgcmVhZGFibGUiKSx0LmVtaXQoInJlYWRhYmxlIiksX2UodCl9ZnVuY3Rpb24gYmUodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGg7IWUucmVhZGluZyYmIWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyayYmKGNlKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxyIT09ZS5sZW5ndGgpOylyPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gbWUodCl7Y2UoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHQucmVhZCgwKX1mdW5jdGlvbiB3ZSh0LGUpe2UucmVhZGluZ3x8KGNlKCJyZXN1bWUgcmVhZCAwIiksdC5yZWFkKDApKSxlLnJlc3VtZVNjaGVkdWxlZD0hMSxlLmF3YWl0RHJhaW49MCx0LmVtaXQoInJlc3VtZSIpLF9lKHQpLGUuZmxvd2luZyYmIWUucmVhZGluZyYmdC5yZWFkKDApfWZ1bmN0aW9uIF9lKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGNlKCJmbG93IixlLmZsb3dpbmcpO2UuZmxvd2luZyYmbnVsbCE9PXQucmVhZCgpOyk7fWZ1bmN0aW9uIFNlKHQsZSl7cmV0dXJuIDA9PT1lLmxlbmd0aD9udWxsOihlLm9iamVjdE1vZGU/cj1lLmJ1ZmZlci5zaGlmdCgpOiF0fHx0Pj1lLmxlbmd0aD8ocj1lLmRlY29kZXI/ZS5idWZmZXIuam9pbigiIik6MT09PWUuYnVmZmVyLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGE6ZS5idWZmZXIuY29uY2F0KGUubGVuZ3RoKSxlLmJ1ZmZlci5jbGVhcigpKTpyPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbjt0PGUuaGVhZC5kYXRhLmxlbmd0aD8obj1lLmhlYWQuZGF0YS5zbGljZSgwLHQpLGUuaGVhZC5kYXRhPWUuaGVhZC5kYXRhLnNsaWNlKHQpKTpuPXQ9PT1lLmhlYWQuZGF0YS5sZW5ndGg/ZS5zaGlmdCgpOnI/ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmhlYWQsbj0xLGk9ci5kYXRhO3QtPWkubGVuZ3RoO2Zvcig7cj1yLm5leHQ7KXt2YXIgbz1yLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYocz09PW8ubGVuZ3RoP2krPW86aSs9by5zbGljZSgwLHQpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytuLHIubmV4dD9lLmhlYWQ9ci5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1yLHIuZGF0YT1vLnNsaWNlKHMpKTticmVha30rK259cmV0dXJuIGUubGVuZ3RoLT1uLGl9KHQsZSk6ZnVuY3Rpb24odCxlKXt2YXIgcj1BLmFsbG9jVW5zYWZlKHQpLG49ZS5oZWFkLGk9MTtuLmRhdGEuY29weShyKSx0LT1uLmRhdGEubGVuZ3RoO2Zvcig7bj1uLm5leHQ7KXt2YXIgbz1uLmRhdGEscz10Pm8ubGVuZ3RoP28ubGVuZ3RoOnQ7aWYoby5jb3B5KHIsci5sZW5ndGgtdCwwLHMpLDA9PT0odC09cykpe3M9PT1vLmxlbmd0aD8oKytpLG4ubmV4dD9lLmhlYWQ9bi5uZXh0OmUuaGVhZD1lLnRhaWw9bnVsbCk6KGUuaGVhZD1uLG4uZGF0YT1vLnNsaWNlKHMpKTticmVha30rK2l9cmV0dXJuIGUubGVuZ3RoLT1pLHJ9KHQsZSk7cmV0dXJuIG59KHQsZS5idWZmZXIsZS5kZWNvZGVyKSxyKTt2YXIgcn1mdW5jdGlvbiBFZSh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHd0KGtlLGUsdCkpfWZ1bmN0aW9uIGtlKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBBZSgpe31mdW5jdGlvbiBUZSh0LGUscil7dGhpcy5jaHVuaz10LHRoaXMuZW5jb2Rpbmc9ZSx0aGlzLmNhbGxiYWNrPXIsdGhpcy5uZXh0PW51bGx9ZnVuY3Rpb24gT2UodCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnVmZmVyIix7Z2V0OkR0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSksIl93cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyIGluc3RlYWQuIil9KSx0PXR8fHt9LHRoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxlIGluc3RhbmNlb2YgRmUmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXQud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgcj10LmhpZ2hXYXRlck1hcmssbj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPXJ8fDA9PT1yP3I6bix0aGlzLmhpZ2hXYXRlck1hcms9fn50aGlzLmhpZ2hXYXRlck1hcmssdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExO3ZhciBpPSExPT09dC5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0haSx0aGlzLmRlZmF1bHRFbmNvZGluZz10LmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5fd3JpdGFibGVTdGF0ZSxuPXIuc3luYyxpPXIud3JpdGVjYjtpZihmdW5jdGlvbih0KXt0LndyaXRpbmc9ITEsdC53cml0ZWNiPW51bGwsdC5sZW5ndGgtPXQud3JpdGVsZW4sdC53cml0ZWxlbj0wfShyKSxlKSFmdW5jdGlvbih0LGUscixuLGkpey0tZS5wZW5kaW5nY2Iscj93dChpLG4pOmkobik7dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIsbil9KHQscixuLGUsaSk7ZWxzZXt2YXIgbz1NZShyKTtvfHxyLmNvcmtlZHx8ci5idWZmZXJQcm9jZXNzaW5nfHwhci5idWZmZXJlZFJlcXVlc3R8fFBlKHQsciksbj93dChDZSx0LHIsbyxpKTpDZSh0LHIsbyxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKHRoaXMpfWZ1bmN0aW9uIGplKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGplfHx0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgamUodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgT2UodCx0aGlzKSx0aGlzLndyaXRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC53cml0ZSYmKHRoaXMuX3dyaXRlPXQud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRldiYmKHRoaXMuX3dyaXRldj10LndyaXRldikpLGUuY2FsbCh0aGlzKX1mdW5jdGlvbiBMZSh0LGUscixuLGksbyxzKXtlLndyaXRlbGVuPW4sZS53cml0ZWNiPXMsZS53cml0aW5nPSEwLGUuc3luYz0hMCxyP3QuX3dyaXRldihpLGUub253cml0ZSk6dC5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIENlKHQsZSxyLG4pe3J8fGZ1bmN0aW9uKHQsZSl7MD09PWUubGVuZ3RoJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHQuZW1pdCgiZHJhaW4iKSl9KHQsZSksZS5wZW5kaW5nY2ItLSxuKCkseGUodCxlKX1mdW5jdGlvbiBQZSh0LGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdDtpZih0Ll93cml0ZXYmJnImJnIubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9cjtmb3IodmFyIHM9MDtyOylpW3NdPXIscj1yLm5leHQscys9MTtMZSh0LGUsITAsZS5sZW5ndGgsaSwiIixvLmZpbmlzaCksZS5wZW5kaW5nY2IrKyxlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCxvLm5leHQ/KGUuY29ya2VkUmVxdWVzdHNGcmVlPW8ubmV4dCxvLm5leHQ9bnVsbCk6ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IFVlKGUpfWVsc2V7Zm9yKDtyOyl7dmFyIGE9ci5jaHVuayx1PXIuZW5jb2RpbmcsaD1yLmNhbGxiYWNrO2lmKExlKHQsZSwhMSxlLm9iamVjdE1vZGU/MTphLmxlbmd0aCxhLHUsaCkscj1yLm5leHQsZS53cml0aW5nKWJyZWFrfW51bGw9PT1yJiYoZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfWUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCxlLmJ1ZmZlcmVkUmVxdWVzdD1yLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdC5lbmRpbmcmJjA9PT10Lmxlbmd0aCYmbnVsbD09PXQuYnVmZmVyZWRSZXF1ZXN0JiYhdC5maW5pc2hlZCYmIXQud3JpdGluZ31mdW5jdGlvbiBCZSh0LGUpe2UucHJlZmluaXNoZWR8fChlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikpfWZ1bmN0aW9uIHhlKHQsZSl7dmFyIHI9TWUoZSk7cmV0dXJuIHImJigwPT09ZS5wZW5kaW5nY2I/KEJlKHQsZSksZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKTpCZSh0LGUpKSxyfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKHIpe3ZhciBuPWUuZW50cnk7Zm9yKGUuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLGkociksbj1uLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9fXBlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe2NlKCJyZWFkIix0KSx0PXBhcnNlSW50KHQsMTApO3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUscj10O2lmKDAhPT10JiYoZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT10JiZlLm5lZWRSZWFkYWJsZSYmKGUubGVuZ3RoPj1lLmhpZ2hXYXRlck1hcmt8fGUuZW5kZWQpKXJldHVybiBjZSgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/RWUodGhpcyk6eWUodGhpcyksbnVsbDtpZigwPT09KHQ9Z2UodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmRWUodGhpcyksbnVsbDt2YXIgbixpPWUubmVlZFJlYWRhYmxlO3JldHVybiBjZSgibmVlZCByZWFkYWJsZSIsaSksKDA9PT1lLmxlbmd0aHx8ZS5sZW5ndGgtdDxlLmhpZ2hXYXRlck1hcmspJiZjZSgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9jZSgicmVhZGluZyBvciBlbmRlZCIsaT0hMSk6aSYmKGNlKCJkbyByZWFkIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCwwPT09ZS5sZW5ndGgmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fCh0PWdlKHIsZSkpKSxudWxsPT09KG49dD4wP1NlKHQsZSk6bnVsbCk/KGUubmVlZFJlYWRhYmxlPSEwLHQ9MCk6ZS5sZW5ndGgtPXQsMD09PWUubGVuZ3RoJiYoZS5lbmRlZHx8KGUubmVlZFJlYWRhYmxlPSEwKSxyIT09dCYmZS5lbmRlZCYmRWUodGhpcykpLG51bGwhPT1uJiZ0aGlzLmVtaXQoImRhdGEiLG4pLG59LHBlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0scGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2gobi5waXBlc0NvdW50KXtjYXNlIDA6bi5waXBlcz10O2JyZWFrO2Nhc2UgMTpuLnBpcGVzPVtuLnBpcGVzLHRdO2JyZWFrO2RlZmF1bHQ6bi5waXBlcy5wdXNoKHQpfW4ucGlwZXNDb3VudCs9MSxjZSgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixuLnBpcGVzQ291bnQsZSk7dmFyIGk9IWV8fCExIT09ZS5lbmQ/czpoO2Z1bmN0aW9uIG8odCl7Y2UoIm9udW5waXBlIiksdD09PXImJmgoKX1mdW5jdGlvbiBzKCl7Y2UoIm9uZW5kIiksdC5lbmQoKX1uLmVuZEVtaXR0ZWQ/d3QoaSk6ci5vbmNlKCJlbmQiLGkpLHQub24oInVucGlwZSIsbyk7dmFyIGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5fcmVhZGFibGVTdGF0ZTtjZSgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZ0Lmxpc3RlbmVycygiZGF0YSIpLmxlbmd0aCYmKGUuZmxvd2luZz0hMCxfZSh0KSl9fShyKTt0Lm9uKCJkcmFpbiIsYSk7dmFyIHU9ITE7ZnVuY3Rpb24gaCgpe2NlKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsZCksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGEpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG8pLHIucmVtb3ZlTGlzdGVuZXIoImVuZCIscyksci5yZW1vdmVMaXN0ZW5lcigiZW5kIixoKSxyLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixjKSx1PSEwLCFuLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8YSgpfXZhciBmPSExO2Z1bmN0aW9uIGMoZSl7Y2UoIm9uZGF0YSIpLGY9ITEsITEhPT10LndyaXRlKGUpfHxmfHwoKDE9PT1uLnBpcGVzQ291bnQmJm4ucGlwZXM9PT10fHxuLnBpcGVzQ291bnQ+MSYmLTEhPT1SZShuLnBpcGVzLHQpKSYmIXUmJihjZSgiZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlIixyLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pLHIuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrLGY9ITApLHIucGF1c2UoKSl9ZnVuY3Rpb24gbChlKXt2YXIgcjtjZSgib25lcnJvciIsZSksZygpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixsKSwwPT09KHI9ImVycm9yIix0Lmxpc3RlbmVycyhyKS5sZW5ndGgpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBwKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixkKSxnKCl9ZnVuY3Rpb24gZCgpe2NlKCJvbmZpbmlzaCIpLHQucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixwKSxnKCl9ZnVuY3Rpb24gZygpe2NlKCJ1bnBpcGUiKSxyLnVucGlwZSh0KX1yZXR1cm4gci5vbigiZGF0YSIsYyksZnVuY3Rpb24odCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gdC5wcmVwZW5kTGlzdGVuZXIoZSxyKTt0Ll9ldmVudHMmJnQuX2V2ZW50c1tlXT9BcnJheS5pc0FycmF5KHQuX2V2ZW50c1tlXSk/dC5fZXZlbnRzW2VdLnVuc2hpZnQocik6dC5fZXZlbnRzW2VdPVtyLHQuX2V2ZW50c1tlXV06dC5vbihlLHIpfSh0LCJlcnJvciIsbCksdC5vbmNlKCJjbG9zZSIscCksdC5vbmNlKCJmaW5pc2giLGQpLHQuZW1pdCgicGlwZSIsciksbi5mbG93aW5nfHwoY2UoInBpcGUgcmVzdW1lIiksci5yZXN1bWUoKSksdH0scGUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlO2lmKDA9PT1lLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PWUucGlwZXNDb3VudClyZXR1cm4gdCYmdCE9PWUucGlwZXN8fCh0fHwodD1lLnBpcGVzKSxlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExLHQmJnQuZW1pdCgidW5waXBlIix0aGlzKSksdGhpcztpZighdCl7dmFyIHI9ZS5waXBlcyxuPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgaT0wO2k8bjtpKyspcltpXS5lbWl0KCJ1bnBpcGUiLHRoaXMpO3JldHVybiB0aGlzfXZhciBvPVJlKGUucGlwZXMsdCk7cmV0dXJuLTE9PT1vfHwoZS5waXBlcy5zcGxpY2UobywxKSxlLnBpcGVzQ291bnQtPTEsMT09PWUucGlwZXNDb3VudCYmKGUucGlwZXM9ZS5waXBlc1swXSksdC5lbWl0KCJ1bnBpcGUiLHRoaXMpKSx0aGlzfSxwZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyKXt2YXIgbj1lLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxyKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5lbmRFbWl0dGVkfHxpLnJlYWRhYmxlTGlzdGVuaW5nfHwoaS5yZWFkYWJsZUxpc3RlbmluZz1pLm5lZWRSZWFkYWJsZT0hMCxpLmVtaXR0ZWRSZWFkYWJsZT0hMSxpLnJlYWRpbmc/aS5sZW5ndGgmJnllKHRoaXMpOnd0KG1lLHRoaXMpKX1yZXR1cm4gbn0scGUucHJvdG90eXBlLmFkZExpc3RlbmVyPXBlLnByb3RvdHlwZS5vbixwZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoY2UoInJlc3VtZSIpLHQuZmxvd2luZz0hMCxmdW5jdGlvbih0LGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAsd3Qod2UsdCxlKSl9KHRoaXMsdCkpLHRoaXN9LHBlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBjZSgiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoY2UoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30scGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExLG49dGhpcztmb3IodmFyIGkgaW4gdC5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihjZSgid3JhcHBlZCBlbmQiKSxlLmRlY29kZXImJiFlLmVuZGVkKXt2YXIgdD1lLmRlY29kZXIuZW5kKCk7dCYmdC5sZW5ndGgmJm4ucHVzaCh0KX1uLnB1c2gobnVsbCl9KSksdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGkpeyhjZSgid3JhcHBlZCBkYXRhIiksZS5kZWNvZGVyJiYoaT1lLmRlY29kZXIud3JpdGUoaSkpLGUub2JqZWN0TW9kZSYmbnVsbD09aSl8fChlLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKG4ucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllKHRbcl0scil9KFsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdLChmdW5jdGlvbihlKXt0Lm9uKGUsbi5lbWl0LmJpbmQobixlKSl9KSksbi5fcmVhZD1mdW5jdGlvbihlKXtjZSgid3JhcHBlZCBfcmVhZCIsZSksciYmKHI9ITEsdC5yZXN1bWUoKSl9LG59LHBlLl9mcm9tTGlzdD1TZSxqZS5Xcml0YWJsZVN0YXRlPU9lLHh0KGplLGUpLE9lLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5idWZmZXJlZFJlcXVlc3QsZT1bXTt0OyllLnB1c2godCksdD10Lm5leHQ7cmV0dXJuIGV9LGplLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxqZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLEEuaXNCdWZmZXIodCk/ZT0iYnVmZmVyIjplfHwoZT1uLmRlZmF1bHRFbmNvZGluZyksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPUFlKSxuLmVuZGVkP2Z1bmN0aW9uKHQsZSl7dmFyIHI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTt0LmVtaXQoImVycm9yIixyKSx3dChlLHIpfSh0aGlzLHIpOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPSEwLG89ITE7cmV0dXJuIG51bGw9PT1yP289bmV3IFR5cGVFcnJvcigiTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0iKTpBLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHJ8fHZvaWQgMD09PXJ8fGUub2JqZWN0TW9kZXx8KG89bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxvJiYodC5lbWl0KCJlcnJvciIsbyksd3QobixvKSxpPSExKSxpfSh0aGlzLG4sdCxyKSYmKG4ucGVuZGluZ2NiKyssaT1mdW5jdGlvbih0LGUscixuLGkpe3I9ZnVuY3Rpb24odCxlLHIpe3Qub2JqZWN0TW9kZXx8ITE9PT10LmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgZXx8KGU9QS5mcm9tKGUscikpO3JldHVybiBlfShlLHIsbiksQS5pc0J1ZmZlcihyKSYmKG49ImJ1ZmZlciIpO3ZhciBvPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1vO3ZhciBzPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztzfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBhPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IFRlKHIsbixpKSxhP2EubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBMZSh0LGUsITEsbyxyLG4saSk7cmV0dXJuIHN9KHRoaXMsbix0LGUscikpLGl9LGplLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30samUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3dyaXRhYmxlU3RhdGU7dC5jb3JrZWQmJih0LmNvcmtlZC0tLHQud3JpdGluZ3x8dC5jb3JrZWR8fHQuZmluaXNoZWR8fHQuYnVmZmVyUHJvY2Vzc2luZ3x8IXQuYnVmZmVyZWRSZXF1ZXN0fHxQZSh0aGlzLHQpKX0samUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30samUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUscil7cihuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpKX0samUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxqZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhyPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxuLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUscil7ZS5lbmRpbmc9ITAseGUodCxlKSxyJiYoZS5maW5pc2hlZD93dChyKTp0Lm9uY2UoImZpbmlzaCIscikpO2UuZW5kZWQ9ITAsdC53cml0YWJsZT0hMX0odGhpcyxuLHIpfSx4dChGZSxwZSk7Zm9yKHZhciBJZT1PYmplY3Qua2V5cyhqZS5wcm90b3R5cGUpLERlPTA7RGU8SWUubGVuZ3RoO0RlKyspe3ZhciBOZT1JZVtEZV07RmUucHJvdG90eXBlW05lXXx8KEZlLnByb3RvdHlwZVtOZV09amUucHJvdG90eXBlW05lXSl9ZnVuY3Rpb24gRmUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgRmUpKXJldHVybiBuZXcgRmUodCk7cGUuY2FsbCh0aGlzLHQpLGplLmNhbGwodGhpcyx0KSx0JiYhMT09PXQucmVhZGFibGUmJih0aGlzLnJlYWRhYmxlPSExKSx0JiYhMT09PXQud3JpdGFibGUmJih0aGlzLndyaXRhYmxlPSExKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsdCYmITE9PT10LmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEpLHRoaXMub25jZSgiZW5kIix6ZSl9ZnVuY3Rpb24gemUoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHd0KHFlLHRoaXMpfWZ1bmN0aW9uIHFlKHQpe3QuZW5kKCl9ZnVuY3Rpb24gWWUodCl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG49dC5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIGk9bi53cml0ZWNiO2lmKCFpKXJldHVybiB0LmVtaXQoImVycm9yIixuZXcgRXJyb3IoIm5vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPXImJnQucHVzaChyKTtpKGUpO3ZhciBvPXQuX3JlYWRhYmxlU3RhdGU7by5yZWFkaW5nPSExLChvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdC5fcmVhZChvLmhpZ2hXYXRlck1hcmspfSh0LGUscil9LHRoaXMubmVlZFRyYW5zZm9ybT0hMSx0aGlzLnRyYW5zZm9ybWluZz0hMSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlY2h1bms9bnVsbCx0aGlzLndyaXRlZW5jb2Rpbmc9bnVsbH1mdW5jdGlvbiBXZSh0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBXZSkpcmV0dXJuIG5ldyBXZSh0KTtGZS5jYWxsKHRoaXMsdCksdGhpcy5fdHJhbnNmb3JtU3RhdGU9bmV3IFllKHRoaXMpO3ZhciBlPXRoaXM7dGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGU9ITAsdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPSExLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC50cmFuc2Zvcm0mJih0aGlzLl90cmFuc2Zvcm09dC50cmFuc2Zvcm0pLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZsdXNoJiYodGhpcy5fZmx1c2g9dC5mbHVzaCkpLHRoaXMub25jZSgicHJlZmluaXNoIiwoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQpeyRlKGUsdCl9KSk6JGUoZSl9KSl9ZnVuY3Rpb24gJGUodCxlKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTt2YXIgcj10Ll93cml0YWJsZVN0YXRlLG49dC5fdHJhbnNmb3JtU3RhdGU7aWYoci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihuLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gdC5wdXNoKG51bGwpfWZ1bmN0aW9uIEdlKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEdlKSlyZXR1cm4gbmV3IEdlKHQpO1dlLmNhbGwodGhpcyx0KX1mdW5jdGlvbiBKZSgpe2UuY2FsbCh0aGlzKX14dChXZSxGZSksV2UucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxGZS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sV2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LFdlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKG4ud3JpdGVjYj1yLG4ud3JpdGVjaHVuaz10LG4ud3JpdGVlbmNvZGluZz1lLCFuLnRyYW5zZm9ybWluZyl7dmFyIGk9dGhpcy5fcmVhZGFibGVTdGF0ZTsobi5uZWVkVHJhbnNmb3JtfHxpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfX0sV2UucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGwhPT1lLndyaXRlY2h1bmsmJmUud3JpdGVjYiYmIWUudHJhbnNmb3JtaW5nPyhlLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0oZS53cml0ZWNodW5rLGUud3JpdGVlbmNvZGluZyxlLmFmdGVyVHJhbnNmb3JtKSk6ZS5uZWVkVHJhbnNmb3JtPSEwfSx4dChHZSxXZSksR2UucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3IobnVsbCx0KX0seHQoSmUsZSksSmUuUmVhZGFibGU9cGUsSmUuV3JpdGFibGU9amUsSmUuRHVwbGV4PUZlLEplLlRyYW5zZm9ybT1XZSxKZS5QYXNzVGhyb3VnaD1HZSxKZS5TdHJlYW09SmUsSmUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxyJiYhMT09PXIuZW5kfHwobi5vbigiZW5kIixhKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBzPSExO2Z1bmN0aW9uIGEoKXtzfHwocz0hMCx0LmVuZCgpKX1mdW5jdGlvbiB1KCl7c3x8KHM9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGgodCl7aWYoZigpLDA9PT1lLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixhKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixoKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixoKSx0Lm9uKCJlcnJvciIsaCksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH07dmFyIEhlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307dmFyIFZlLEtlLFplPShWZT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtlJiYodC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSl9OnQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9fX0sVmUoS2U9e2V4cG9ydHM6e319LEtlLmV4cG9ydHMpLEtlLmV4cG9ydHMpO2xldCBRZT10cigpO2Z1bmN0aW9uIFhlKHQsZSl7KCJvYmplY3QiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KSkmJihlPXQsdD17fSk7bGV0IHI9bmV3IFFlKHQpO3ZhciBuO3JldHVybiByLl9mcm9tPUFycmF5LmlzQXJyYXkoZSk/KG49KG49ZSkuc2xpY2UoKSxmdW5jdGlvbih0LGUpe2xldCByPW51bGwsaT1uLmxlbmd0aD9uLnNoaWZ0KCk6bnVsbDtpIGluc3RhbmNlb2YgRXJyb3ImJihyPWksaT1udWxsKSxlKHIsaSl9KTplfHxlcixyfWZ1bmN0aW9uIHRyKHQsZSl7ZnVuY3Rpb24gcihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoZSk7dGhpcy5fcmVhZGluZz0hMSx0aGlzLl9jYWxsYmFjaz1mdW5jdGlvbih0LGUpe2lmKG4uZGVzdHJveWVkKXJldHVybjtpZih0KXJldHVybiBuLmRlc3Ryb3kodCk7aWYobnVsbD09PWUpcmV0dXJuIG4ucHVzaChudWxsKTtuLl9yZWFkaW5nPSExLG4ucHVzaChlKSYmbi5fcmVhZChpKX0sdGhpcy5kZXN0cm95ZWQ9ITEscGUuY2FsbCh0aGlzLGV8fHQpO2xldCBuPXRoaXMsaT10aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJihlPXQsdD17fSksdD1ycih0KSxaZShyLHBlKSxyLnByb3RvdHlwZS5fZnJvbT1lfHxlcixyLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLl9yZWFkaW5nfHx0aGlzLmRlc3Ryb3llZHx8KHRoaXMuX3JlYWRpbmc9ITAsdGhpcy5fZnJvbSh0LHRoaXMuX2NhbGxiYWNrKSl9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuZGVzdHJveWVkPSEwO2xldCBlPXRoaXM7cHJvY2Vzcy5uZXh0VGljaygoZnVuY3Rpb24oKXt0JiZlLmVtaXQoImVycm9yIix0KSxlLmVtaXQoImNsb3NlIil9KSl9LHJ9ZnVuY3Rpb24gZXIoKXt9ZnVuY3Rpb24gcnIodCl7cmV0dXJuIHQ9dHx8e319WGUuY3Rvcj10cixYZS5vYmo9ZnVuY3Rpb24odCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCkpJiYoZT10LHQ9e30pLCh0PXJyKHQpKS5vYmplY3RNb2RlPSEwLHQuaGlnaFdhdGVyTWFyaz0xNixYZSh0LGUpfTt2YXIgbnIsaXI9MSxvcj17fSxzcj0hMSxhcj1sLmRvY3VtZW50O2Z1bmN0aW9uIHVyKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPTA7cjxlLmxlbmd0aDtyKyspZVtyXT1hcmd1bWVudHNbcisxXTt2YXIgbj17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBvcltpcl09bixucihpciksaXIrK31mdW5jdGlvbiBocih0KXtpZihzcilzZXRUaW1lb3V0KGhyLDAsdCk7ZWxzZXt2YXIgZT1vclt0XTtpZihlKXtzcj0hMDt0cnl7IWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2FsbGJhY2sscj10LmFyZ3M7c3dpdGNoKHIubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKHJbMF0pO2JyZWFrO2Nhc2UgMjplKHJbMF0sclsxXSk7YnJlYWs7Y2FzZSAzOmUoclswXSxyWzFdLHJbMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseSh2b2lkIDAscil9fShlKX1maW5hbGx5eyFmdW5jdGlvbih0KXtkZWxldGUgb3JbdF19KHQpLHNyPSExfX19fXZhciBmcixjcixscixwcixkcj1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihsKTtmdW5jdGlvbiBncih0KXtsZXQgZSxyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtpZihlPSJbb2JqZWN0IFByb21pc2VdIj09PXIsZSlyZXR1cm4hMDtpZigiW29iamVjdCBGdW5jdGlvbl0iIT09cilyZXR1cm4hMTt0cnl7ZT0iZnVuY3Rpb24iIT10eXBlb2YgdC5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW59Y2F0Y2godCl7fXJldHVybiBlfWZ1bmN0aW9uIHlyKHQpe2xldCBlLHIsbjtmdW5jdGlvbiBpKGkpeygodD1pKWluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyLmlzVmlldyh0KSYmIUEuaXNCdWZmZXIodCkpJiYodD1BLmZyb20odCkpLGU9Z3IodCk/dDpudWxsO2NvbnN0IG89IWUmJnRbU3ltYm9sLml0ZXJhdG9yXSYmInN0cmluZyIhPXR5cGVvZiB0JiYhQS5pc0J1ZmZlcih0KTtyPW8/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbDtjb25zdCBzPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtuPXM/dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTpudWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LnNsaWNlKCkpLGkodCksWGUoKGZ1bmN0aW9uIG8ocyxhKXtpZihlKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7YXdhaXQgaShhd2FpdCBlKSxvLmNhbGwodGhpcyxzLGEpfWNhdGNoKHQpe2EodCl9fSkoKTtpZihyKXtjb25zdCB0PXIubmV4dCgpO3JldHVybiB2b2lkIHVyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1pZihuKXJldHVybiB2b2lkKGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdm9pZCB1cihhLG51bGwsbnVsbCk7Y29uc3QgdT10LnNsaWNlKDAscyk7dD10LnNsaWNlKHMpLHVyKGEsbnVsbCx1KX0pKX1kcj1kciYmZHIuc2V0VGltZW91dD9kcjpsLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwobC5wcm9jZXNzKT9ucj1mdW5jdGlvbih0KXtCdC5uZXh0VGljaygoZnVuY3Rpb24oKXtocih0KX0pKX06IWZ1bmN0aW9uKCl7aWYobC5wb3N0TWVzc2FnZSYmIWwuaW1wb3J0U2NyaXB0cyl7dmFyIHQ9ITAsZT1sLm9ubWVzc2FnZTtyZXR1cm4gbC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXt0PSExfSxsLnBvc3RNZXNzYWdlKCIiLCIqIiksbC5vbm1lc3NhZ2U9ZSx0fX0oKT9sLk1lc3NhZ2VDaGFubmVsPygoY3I9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7aHIodC5kYXRhKX0sbnI9ZnVuY3Rpb24odCl7Y3IucG9ydDIucG9zdE1lc3NhZ2UodCl9KTphciYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBhci5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT8oZnI9YXIuZG9jdW1lbnRFbGVtZW50LG5yPWZ1bmN0aW9uKHQpe3ZhciBlPWFyLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aHIodCksZS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxmci5yZW1vdmVDaGlsZChlKSxlPW51bGx9LGZyLmFwcGVuZENoaWxkKGUpfSk6bnI9ZnVuY3Rpb24odCl7c2V0VGltZW91dChociwwLHQpfToobHI9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHByPWZ1bmN0aW9uKHQpe3Quc291cmNlPT09bCYmInN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT10LmRhdGEuaW5kZXhPZihscikmJmhyKCt0LmRhdGEuc2xpY2UobHIubGVuZ3RoKSl9LGwuYWRkRXZlbnRMaXN0ZW5lcj9sLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHByLCExKTpsLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLHByKSxucj1mdW5jdGlvbih0KXtsLnBvc3RNZXNzYWdlKGxyK3QsIioiKX0pLHlyLm9iamVjdD10PT57bGV0IGUscixuO2Z1bmN0aW9uIGkoaSl7ZT1ncih0PWkpP3Q6bnVsbCxyPSFlJiZ0W1N5bWJvbC5pdGVyYXRvcl0/dFtTeW1ib2wuaXRlcmF0b3JdKCk6bnVsbCxuPSFlJiZ0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXT90W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOm51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXQuc2xpY2UoKSksaSh0KSxYZS5vYmooKGZ1bmN0aW9uIG8ocyxhKXtpZihlKShhc3luYygpPT57dHJ5e2F3YWl0IGkoYXdhaXQgZSksby5jYWxsKHRoaXMscyxhKX1jYXRjaCh0KXthKHQpfX0pKCk7ZWxzZSBpZihyKXtjb25zdCB0PXIubmV4dCgpO3VyKGEsbnVsbCx0LmRvbmU/bnVsbDp0LnZhbHVlKX1lbHNlIG4/KGFzeW5jKCk9Pnt0cnl7Y29uc3QgdD1hd2FpdCBuLm5leHQoKTt1cihhLG51bGwsdC5kb25lP251bGw6dC52YWx1ZSl9Y2F0Y2godCl7dXIoYSx0KX19KSgpOih0aGlzLnB1c2godCksdXIoYSxudWxsLG51bGwpKX0pKX07dmFyIHZyPXt9LGJyPXZyLkxFRlRfQlJBQ0U9MSxtcj12ci5SSUdIVF9CUkFDRT0yLHdyPXZyLkxFRlRfQlJBQ0tFVD0zLF9yPXZyLlJJR0hUX0JSQUNLRVQ9NCxTcj12ci5DT0xPTj01LEVyPXZyLkNPTU1BPTYsa3I9dnIuVFJVRT03LFJyPXZyLkZBTFNFPTgsQXI9dnIuTlVMTD05LFRyPXZyLlNUUklORz0xMCxPcj12ci5OVU1CRVI9MTEsanI9dnIuU1RBUlQ9MTcsTHI9dnIuU1RPUD0xOCxDcj12ci5UUlVFMT0zMyxQcj12ci5UUlVFMj0zNCxNcj12ci5UUlVFMz0zNSxCcj12ci5GQUxTRTE9NDkseHI9dnIuRkFMU0UyPTUwLFVyPXZyLkZBTFNFMz01MSxJcj12ci5GQUxTRTQ9NTIsRHI9dnIuTlVMTDE9NjUsTnI9dnIuTlVMTDI9NjYsRnI9dnIuTlVMTDM9NjcsenI9dnIuTlVNQkVSMT04MSxxcj12ci5OVU1CRVIzPTgzLFlyPXZyLlNUUklORzE9OTcsV3I9dnIuU1RSSU5HMj05OCwkcj12ci5TVFJJTkczPTk5LEdyPXZyLlNUUklORzQ9MTAwLEpyPXZyLlNUUklORzU9MTAxLEhyPXZyLlNUUklORzY9MTAyLFZyPXZyLlZBTFVFPTExMyxLcj12ci5LRVk9MTE0LFpyPXZyLk9CSkVDVD0xMjksUXI9dnIuQVJSQVk9MTMwLFhyPSJcXCIuY2hhckNvZGVBdCgwKSx0bj0iLyIuY2hhckNvZGVBdCgwKSxlbj0iXGIiLmNoYXJDb2RlQXQoMCkscm49IlxmIi5jaGFyQ29kZUF0KDApLG5uPSJcbiIuY2hhckNvZGVBdCgwKSxvbj0iXHIiLmNoYXJDb2RlQXQoMCksc249Ilx0Ii5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGFuKCl7dGhpcy50U3RhdGU9anIsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy5zdHJpbmc9dm9pZCAwLHRoaXMuc3RyaW5nQnVmZmVyPUEuYWxsb2M/QS5hbGxvYyg2NTUzNik6bmV3IEEoNjU1MzYpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy51bmljb2RlPXZvaWQgMCx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwLHRoaXMua2V5PXZvaWQgMCx0aGlzLm1vZGU9dm9pZCAwLHRoaXMuc3RhY2s9W10sdGhpcy5zdGF0ZT1Wcix0aGlzLmJ5dGVzX3JlbWFpbmluZz0wLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MCx0aGlzLnRlbXBfYnVmZnM9ezI6bmV3IEEoMiksMzpuZXcgQSgzKSw0Om5ldyBBKDQpfSx0aGlzLm9mZnNldD0tMX1hbi50b2tuYW09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHZyKSxyPTAsbj1lLmxlbmd0aDtyPG47cisrKXt2YXIgaT1lW3JdO2lmKHZyW2ldPT09dClyZXR1cm4gaX1yZXR1cm4gdCYmIjB4Iit0LnRvU3RyaW5nKDE2KX07dmFyIHVuPWFuLnByb3RvdHlwZTt1bi5vbkVycm9yPWZ1bmN0aW9uKHQpe3Rocm93IHR9LHVuLmNoYXJFcnJvcj1mdW5jdGlvbih0LGUpe3RoaXMudFN0YXRlPUxyLHRoaXMub25FcnJvcihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgIitKU09OLnN0cmluZ2lmeShTdHJpbmcuZnJvbUNoYXJDb2RlKHRbZV0pKSsiIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpfSx1bi5hcHBlbmRTdHJpbmdDaGFyPWZ1bmN0aW9uKHQpe3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0Pj02NTUzNiYmKHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIpLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTApLHRoaXMuc3RyaW5nQnVmZmVyW3RoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KytdPXR9LHVuLmFwcGVuZFN0cmluZ0J1Zj1mdW5jdGlvbih0LGUscil7dmFyIG49dC5sZW5ndGg7Im51bWJlciI9PXR5cGVvZiBlJiYobj0ibnVtYmVyIj09dHlwZW9mIHI/cjwwP3QubGVuZ3RoLWUrcjpyLWU6dC5sZW5ndGgtZSksbjwwJiYobj0wKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCtuPjY1NTM2JiYodGhpcy5zdHJpbmcrPXRoaXMuc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCJ1dGY4IiwwLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0KSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldD0wKSx0LmNvcHkodGhpcy5zdHJpbmdCdWZmZXIsdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQsZSxyKSx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCs9bn0sdW4ud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7InN0cmluZyI9PXR5cGVvZiB0JiYodD1uZXcgQSh0KSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWlmKHRoaXMudFN0YXRlPT09anIpe2lmKGU9dFtyXSx0aGlzLm9mZnNldCsrLDEyMz09PWUpdGhpcy5vblRva2VuKGJyLCJ7Iik7ZWxzZSBpZigxMjU9PT1lKXRoaXMub25Ub2tlbihtciwifSIpO2Vsc2UgaWYoOTE9PT1lKXRoaXMub25Ub2tlbih3ciwiWyIpO2Vsc2UgaWYoOTM9PT1lKXRoaXMub25Ub2tlbihfciwiXSIpO2Vsc2UgaWYoNTg9PT1lKXRoaXMub25Ub2tlbihTciwiOiIpO2Vsc2UgaWYoNDQ9PT1lKXRoaXMub25Ub2tlbihFciwiLCIpO2Vsc2UgaWYoMTE2PT09ZSl0aGlzLnRTdGF0ZT1DcjtlbHNlIGlmKDEwMj09PWUpdGhpcy50U3RhdGU9QnI7ZWxzZSBpZigxMTA9PT1lKXRoaXMudFN0YXRlPURyO2Vsc2UgaWYoMzQ9PT1lKXRoaXMuc3RyaW5nPSIiLHRoaXMuc3RyaW5nQnVmZmVyT2Zmc2V0PTAsdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig0NT09PWUpdGhpcy5zdHJpbmc9Ii0iLHRoaXMudFN0YXRlPXpyO2Vsc2UgaWYoZT49NDgmJmU8NjQpdGhpcy5zdHJpbmc9U3RyaW5nLmZyb21DaGFyQ29kZShlKSx0aGlzLnRTdGF0ZT1xcjtlbHNlIGlmKDMyIT09ZSYmOSE9PWUmJjEwIT09ZSYmMTMhPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpfWVsc2UgaWYodGhpcy50U3RhdGU9PT1ZcilpZihlPXRbcl0sdGhpcy5ieXRlc19yZW1haW5pbmc+MCl7Zm9yKHZhciBpPTA7aTx0aGlzLmJ5dGVzX3JlbWFpbmluZztpKyspdGhpcy50ZW1wX2J1ZmZzW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2VdW3RoaXMuYnl0ZXNfaW5fc2VxdWVuY2UtdGhpcy5ieXRlc19yZW1haW5pbmcraV09dFtpXTt0aGlzLmFwcGVuZFN0cmluZ0J1Zih0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV0pLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9dGhpcy5ieXRlc19yZW1haW5pbmc9MCxyPXIraS0xfWVsc2UgaWYoMD09PXRoaXMuYnl0ZXNfcmVtYWluaW5nJiZlPj0xMjgpe2lmKGU8PTE5M3x8ZT4yNDQpcmV0dXJuIHRoaXMub25FcnJvcihuZXcgRXJyb3IoIkludmFsaWQgVVRGLTggY2hhcmFjdGVyIGF0IHBvc2l0aW9uICIrcisiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMudFN0YXRlKSkpO2lmKGU+PTE5NCYmZTw9MjIzJiYodGhpcy5ieXRlc19pbl9zZXF1ZW5jZT0yKSxlPj0yMjQmJmU8PTIzOSYmKHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2U9MyksZT49MjQwJiZlPD0yNDQmJih0aGlzLmJ5dGVzX2luX3NlcXVlbmNlPTQpLHRoaXMuYnl0ZXNfaW5fc2VxdWVuY2Urcj50Lmxlbmd0aCl7Zm9yKHZhciBvPTA7bzw9dC5sZW5ndGgtMS1yO28rKyl0aGlzLnRlbXBfYnVmZnNbdGhpcy5ieXRlc19pbl9zZXF1ZW5jZV1bb109dFtyK29dO3RoaXMuYnl0ZXNfcmVtYWluaW5nPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS10Lmxlbmd0aCxyPXQubGVuZ3RoLTF9ZWxzZSB0aGlzLmFwcGVuZFN0cmluZ0J1Zih0LHIscit0aGlzLmJ5dGVzX2luX3NlcXVlbmNlKSxyPXIrdGhpcy5ieXRlc19pbl9zZXF1ZW5jZS0xfWVsc2UgaWYoMzQ9PT1lKXRoaXMudFN0YXRlPWpyLHRoaXMuc3RyaW5nKz10aGlzLnN0cmluZ0J1ZmZlci50b1N0cmluZygidXRmOCIsMCx0aGlzLnN0cmluZ0J1ZmZlck9mZnNldCksdGhpcy5zdHJpbmdCdWZmZXJPZmZzZXQ9MCx0aGlzLm9uVG9rZW4oVHIsdGhpcy5zdHJpbmcpLHRoaXMub2Zmc2V0Kz1BLmJ5dGVMZW5ndGgodGhpcy5zdHJpbmcsInV0ZjgiKSsxLHRoaXMuc3RyaW5nPXZvaWQgMDtlbHNlIGlmKDkyPT09ZSl0aGlzLnRTdGF0ZT1XcjtlbHNle2lmKCEoZT49MzIpKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMuYXBwZW5kU3RyaW5nQ2hhcihlKX1lbHNlIGlmKHRoaXMudFN0YXRlPT09V3IpaWYoMzQ9PT0oZT10W3JdKSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIoZSksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZig5Mj09PWUpdGhpcy5hcHBlbmRTdHJpbmdDaGFyKFhyKSx0aGlzLnRTdGF0ZT1ZcjtlbHNlIGlmKDQ3PT09ZSl0aGlzLmFwcGVuZFN0cmluZ0NoYXIodG4pLHRoaXMudFN0YXRlPVlyO2Vsc2UgaWYoOTg9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihlbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMDI9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihybiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTA9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihubiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTQ9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihvbiksdGhpcy50U3RhdGU9WXI7ZWxzZSBpZigxMTY9PT1lKXRoaXMuYXBwZW5kU3RyaW5nQ2hhcihzbiksdGhpcy50U3RhdGU9WXI7ZWxzZXtpZigxMTchPT1lKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudW5pY29kZT0iIix0aGlzLnRTdGF0ZT0kcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09JHJ8fHRoaXMudFN0YXRlPT09R3J8fHRoaXMudFN0YXRlPT09SnJ8fHRoaXMudFN0YXRlPT09SHIpe2lmKCEoKGU9dFtyXSk+PTQ4JiZlPDY0fHxlPjY0JiZlPD03MHx8ZT45NiYmZTw9MTAyKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTtpZih0aGlzLnVuaWNvZGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksdGhpcy50U3RhdGUrKz09PUhyKXt2YXIgcz1wYXJzZUludCh0aGlzLnVuaWNvZGUsMTYpO3RoaXMudW5pY29kZT12b2lkIDAsdm9pZCAwIT09dGhpcy5oaWdoU3Vycm9nYXRlJiZzPj01NjMyMCYmczw1NzM0ND8odGhpcy5hcHBlbmRTdHJpbmdCdWYobmV3IEEoU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmhpZ2hTdXJyb2dhdGUscykpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKTp2b2lkIDA9PT10aGlzLmhpZ2hTdXJyb2dhdGUmJnM+PTU1Mjk2JiZzPDU2MzIwP3RoaXMuaGlnaFN1cnJvZ2F0ZT1zOih2b2lkIDAhPT10aGlzLmhpZ2hTdXJyb2dhdGUmJih0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuaGlnaFN1cnJvZ2F0ZSkpKSx0aGlzLmhpZ2hTdXJyb2dhdGU9dm9pZCAwKSx0aGlzLmFwcGVuZFN0cmluZ0J1ZihuZXcgQShTdHJpbmcuZnJvbUNoYXJDb2RlKHMpKSkpLHRoaXMudFN0YXRlPVlyfX1lbHNlIGlmKHRoaXMudFN0YXRlPT09enJ8fHRoaXMudFN0YXRlPT09cXIpc3dpdGNoKGU9dFtyXSl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQ2OmNhc2UgMTAxOmNhc2UgNjk6Y2FzZSA0MzpjYXNlIDQ1OnRoaXMuc3RyaW5nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHRoaXMudFN0YXRlPXFyO2JyZWFrO2RlZmF1bHQ6dGhpcy50U3RhdGU9anI7dmFyIGE9TnVtYmVyKHRoaXMuc3RyaW5nKTtpZihpc05hTihhKSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnN0cmluZy5tYXRjaCgvWzAtOV0rLyk9PXRoaXMuc3RyaW5nJiZhLnRvU3RyaW5nKCkhPXRoaXMuc3RyaW5nP3RoaXMub25Ub2tlbihUcix0aGlzLnN0cmluZyk6dGhpcy5vblRva2VuKE9yLGEpLHRoaXMub2Zmc2V0Kz10aGlzLnN0cmluZy5sZW5ndGgtMSx0aGlzLnN0cmluZz12b2lkIDAsci0tfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Dcil7aWYoMTE0IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Qcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09UHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TXJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU1yKXtpZigxMDEhPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPWpyLHRoaXMub25Ub2tlbihrciwhMCksdGhpcy5vZmZzZXQrPTN9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PUJyKXtpZig5NyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9eHJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PXhyKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPVVyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Vcil7aWYoMTE1IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1Jcn1lbHNlIGlmKHRoaXMudFN0YXRlPT09SXIpe2lmKDEwMSE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9anIsdGhpcy5vblRva2VuKFJyLCExKSx0aGlzLm9mZnNldCs9NH1lbHNlIGlmKHRoaXMudFN0YXRlPT09RHIpe2lmKDExNyE9PXRbcl0pcmV0dXJuIHRoaXMuY2hhckVycm9yKHQscik7dGhpcy50U3RhdGU9TnJ9ZWxzZSBpZih0aGlzLnRTdGF0ZT09PU5yKXtpZigxMDghPT10W3JdKXJldHVybiB0aGlzLmNoYXJFcnJvcih0LHIpO3RoaXMudFN0YXRlPUZyfWVsc2UgaWYodGhpcy50U3RhdGU9PT1Gcil7aWYoMTA4IT09dFtyXSlyZXR1cm4gdGhpcy5jaGFyRXJyb3IodCxyKTt0aGlzLnRTdGF0ZT1qcix0aGlzLm9uVG9rZW4oQXIsbnVsbCksdGhpcy5vZmZzZXQrPTN9fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7fSx1bi5wYXJzZUVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy50U3RhdGU9THIsdGhpcy5vbkVycm9yKG5ldyBFcnJvcigiVW5leHBlY3RlZCAiK2FuLnRva25hbSh0KSsoZT8iKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiOiIiKSsiIGluIHN0YXRlICIrYW4udG9rbmFtKHRoaXMuc3RhdGUpKSl9LHVuLnB1c2g9ZnVuY3Rpb24oKXt0aGlzLnN0YWNrLnB1c2goe3ZhbHVlOnRoaXMudmFsdWUsa2V5OnRoaXMua2V5LG1vZGU6dGhpcy5tb2RlfSl9LHVuLnBvcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmFsdWUsZT10aGlzLnN0YWNrLnBvcCgpO3RoaXMudmFsdWU9ZS52YWx1ZSx0aGlzLmtleT1lLmtleSx0aGlzLm1vZGU9ZS5tb2RlLHRoaXMuZW1pdCh0KSx0aGlzLm1vZGV8fCh0aGlzLnN0YXRlPVZyKX0sdW4uZW1pdD1mdW5jdGlvbih0KXt0aGlzLm1vZGUmJih0aGlzLnN0YXRlPUVyKSx0aGlzLm9uVmFsdWUodCl9LHVuLm9uVmFsdWU9ZnVuY3Rpb24odCl7fSx1bi5vblRva2VuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5zdGF0ZT09PVZyKWlmKHQ9PT1Ucnx8dD09PU9yfHx0PT09a3J8fHQ9PT1Scnx8dD09PUFyKXRoaXMudmFsdWUmJih0aGlzLnZhbHVlW3RoaXMua2V5XT1lKSx0aGlzLmVtaXQoZSk7ZWxzZSBpZih0PT09YnIpdGhpcy5wdXNoKCksdGhpcy52YWx1ZT90aGlzLnZhbHVlPXRoaXMudmFsdWVbdGhpcy5rZXldPXt9OnRoaXMudmFsdWU9e30sdGhpcy5rZXk9dm9pZCAwLHRoaXMuc3RhdGU9S3IsdGhpcy5tb2RlPVpyO2Vsc2UgaWYodD09PXdyKXRoaXMucHVzaCgpLHRoaXMudmFsdWU/dGhpcy52YWx1ZT10aGlzLnZhbHVlW3RoaXMua2V5XT1bXTp0aGlzLnZhbHVlPVtdLHRoaXMua2V5PTAsdGhpcy5tb2RlPVFyLHRoaXMuc3RhdGU9VnI7ZWxzZSBpZih0PT09bXIpe2lmKHRoaXMubW9kZSE9PVpyKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2V7aWYodCE9PV9yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTtpZih0aGlzLm1vZGUhPT1RcilyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX1lbHNlIGlmKHRoaXMuc3RhdGU9PT1LcilpZih0PT09VHIpdGhpcy5rZXk9ZSx0aGlzLnN0YXRlPVNyO2Vsc2V7aWYodCE9PW1yKXJldHVybiB0aGlzLnBhcnNlRXJyb3IodCxlKTt0aGlzLnBvcCgpfWVsc2UgaWYodGhpcy5zdGF0ZT09PVNyKXtpZih0IT09U3IpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO3RoaXMuc3RhdGU9VnJ9ZWxzZXtpZih0aGlzLnN0YXRlIT09RXIpcmV0dXJuIHRoaXMucGFyc2VFcnJvcih0LGUpO2lmKHQ9PT1Fcil0aGlzLm1vZGU9PT1Rcj8odGhpcy5rZXkrKyx0aGlzLnN0YXRlPVZyKTp0aGlzLm1vZGU9PT1aciYmKHRoaXMuc3RhdGU9S3IpO2Vsc2V7aWYoISh0PT09X3ImJnRoaXMubW9kZT09PVFyfHx0PT09bXImJnRoaXMubW9kZT09PVpyKSlyZXR1cm4gdGhpcy5wYXJzZUVycm9yKHQsZSk7dGhpcy5wb3AoKX19fSxhbi5DPXZyO3ZhciBobj1hbjtmdW5jdGlvbiBmbih0LGUscil7dD10fHxmdW5jdGlvbih0KXt0aGlzLnF1ZXVlKHQpfSxlPWV8fGZ1bmN0aW9uKCl7dGhpcy5xdWV1ZShudWxsKX07bGV0IG49ITEsaT0hMSxvPVtdLHM9ITEsYT1uZXcgSmU7ZnVuY3Rpb24gdSgpe2Zvcig7by5sZW5ndGgmJiFhLnBhdXNlZDspe2xldCB0PW8uc2hpZnQoKTtpZihudWxsPT09dClyZXR1cm4gYS5lbWl0KCJlbmQiKTthLmVtaXQoImRhdGEiLHQpfX1mdW5jdGlvbiBoKCl7YS53cml0YWJsZT0hMSxlLmNhbGwoYSksIWEucmVhZGFibGUmJmEuYXV0b0Rlc3Ryb3kmJmEuZGVzdHJveSgpfXJldHVybiBhLnJlYWRhYmxlPWEud3JpdGFibGU9ITAsYS5wYXVzZWQ9ITEsYS5hdXRvRGVzdHJveT0hKHImJiExPT09ci5hdXRvRGVzdHJveSksYS53cml0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jYWxsKHRoaXMsZSksIWEucGF1c2VkfSxhLnF1ZXVlPWEucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gc3x8KG51bGw9PT10JiYocz0hMCksby5wdXNoKHQpLHUoKSksYX0sYS5vbigiZW5kIiwoZnVuY3Rpb24oKXthLnJlYWRhYmxlPSExLCFhLndyaXRhYmxlJiZhLmF1dG9EZXN0cm95JiZCdC5uZXh0VGljaygoZnVuY3Rpb24oKXthLmRlc3Ryb3koKX0pKX0pKSxhLmVuZD1mdW5jdGlvbih0KXtpZighbilyZXR1cm4gbj0hMCxhcmd1bWVudHMubGVuZ3RoJiZhLndyaXRlKHQpLGgoKSxhfSxhLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighaSlyZXR1cm4gaT0hMCxuPSEwLG8ubGVuZ3RoPTAsYS53cml0YWJsZT1hLnJlYWRhYmxlPSExLGEuZW1pdCgiY2xvc2UiKSxhfSxhLnBhdXNlPWZ1bmN0aW9uKCl7aWYoIWEucGF1c2VkKXJldHVybiBhLnBhdXNlZD0hMCxhfSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBhLnBhdXNlZCYmKGEucGF1c2VkPSExLGEuZW1pdCgicmVzdW1lIikpLHUoKSxhLnBhdXNlZHx8YS5lbWl0KCJkcmFpbiIpLGF9LGF9Zm4udGhyb3VnaD1mbjtsZXQgY249e3BhcnNlOmZ1bmN0aW9uKHQsZSl7bGV0IHIsbjtmdW5jdGlvbiBpKHQsZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2U9PT10OnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmV4ZWM/dC5leGVjKGUpOiJib29sZWFuIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdD90OiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0KGUpfWxldCBvPW5ldyBobixzPWZuKChmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PUEuZnJvbSh0KSksby53cml0ZSh0KX0pLChmdW5jdGlvbih0KXt0JiZzLndyaXRlKHQpLHImJnMuZW1pdCgiaGVhZGVyIixyKSxuJiZzLmVtaXQoImZvb3RlciIsbikscy5xdWV1ZShudWxsKX0pKTtmdW5jdGlvbiBhKHQsZSl7ITEhPT1yJiYocj1yfHx7fSxyW3RdPWUpLCExIT09biYmITE9PT1yJiYobj1ufHx7fSxuW3RdPWUpfXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC5zcGxpdCgiLiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiQqIj09PXQ/e2VtaXRLZXk6ITB9OiIqIj09PXR8fCgiIj09PXQ/e3JlY3Vyc2U6ITB9OnQpfSkpKSx0JiZ0Lmxlbmd0aHx8KHQ9bnVsbCksby5vblZhbHVlPWZ1bmN0aW9uKG4pe2lmKHRoaXMucm9vdHx8KHMucm9vdD1uKSwhdClyZXR1cm47bGV0IG89MCx1PTAsaD0hMSxmPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBlLHI9dFtvXTtpZih1KyssciYmIXIucmVjdXJzZSl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZighaShyLGUua2V5KSlyZXR1cm4gdm9pZCBhKGUua2V5LG4pO2g9ISFyLmVtaXRLZXksZj0hIXIuZW1pdFBhdGgsbysrfWVsc2V7bysrO2xldCByPXRbb107aWYoIXIpcmV0dXJuO2Zvcig7Oyl7aWYoZT11PT09dGhpcy5zdGFjay5sZW5ndGg/dGhpczp0aGlzLnN0YWNrW3VdLCFlKXJldHVybjtpZihpKHIsZS5rZXkpKXtvKyssT2JqZWN0LmlzRnJvemVuKHRoaXMuc3RhY2tbdV0pfHwodGhpcy5zdGFja1t1XS52YWx1ZT1udWxsKTticmVha31hKGUua2V5LG4pLHUrK319fWlmKHImJihzLmVtaXQoImhlYWRlciIscikscj0hMSksdSE9PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybjtsZXQgYz10aGlzLnN0YWNrLnNsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpLmNvbmNhdChbdGhpcy5rZXldKSxsPW47bnVsbCE9bCYmbnVsbCE9KGw9ZT9lKGwsYyk6bCkmJigoaHx8ZikmJihsPXt2YWx1ZTpsfSxoJiYobC5rZXk9dGhpcy5rZXkpLGYmJihsLnBhdGg9YykpLHMucXVldWUobCkpLHRoaXMudmFsdWUmJmRlbGV0ZSB0aGlzLnZhbHVlW3RoaXMua2V5XTtmb3IobGV0IHQgaW4gdGhpcy5zdGFjaylPYmplY3QuaXNGcm96ZW4odGhpcy5zdGFja1t0XSl8fCh0aGlzLnN0YWNrW3RdLnZhbHVlPW51bGwpfSxvLl9vblRva2VuPW8ub25Ub2tlbixvLm9uVG9rZW49ZnVuY3Rpb24oZSxyKXtvLl9vblRva2VuKGUsciksMD09PXRoaXMuc3RhY2subGVuZ3RoJiZzLnJvb3QmJih0fHxzLnF1ZXVlKHMucm9vdCkscy5yb290PW51bGwpfSxvLm9uRXJyb3I9ZnVuY3Rpb24odCl7dC5tZXNzYWdlLmluZGV4T2YoImF0IHBvc2l0aW9uIik+LTEmJih0Lm1lc3NhZ2U9IkludmFsaWQgSlNPTiAoIit0Lm1lc3NhZ2UrIikiKSxzLmVtaXQoImVycm9yIix0KX0sc319LGxuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxuPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2ZvcihsZXQgciBpbiBlKWUuaGFzT3duUHJvcGVydHkocikmJih0W3JdPWVbcl0pfSxsbih0LGUpfTtsZXQgcG4sZG49L1tcXCJcdTAwMDAtXHUwMDFmXHUwMDdmLVx1MDA5Zlx1MDBhZFx1MDYwMC1cdTA2MDRcdTA3MGZcdTE3YjRcdTE3YjVcdTIwMGMtXHUyMDBmXHUyMDI4LVx1MjAyZlx1MjA2MC1cdTIwNmZcdWZlZmZcdWZmZjAtXHVmZmZmXS9nLGduPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifTtmdW5jdGlvbiB5bih0KXtyZXR1cm4gdD8iZnVuY3Rpb24iPT10eXBlb2YgdC50aGVuP3BuLlByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQucmVhZCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucGlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQub25jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXJ9KHQpP3QuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZT9wbi5SZWFkYWJsZU9iamVjdDpwbi5SZWFkYWJsZVN0cmluZzpBcnJheS5pc0FycmF5KHQpP3BuLkFycmF5OiJvYmplY3QiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIE9iamVjdD9wbi5PYmplY3Q6cG4uUHJpbWl0aXZlOnBuLlByaW1pdGl2ZX0hZnVuY3Rpb24odCl7dFt0LkFycmF5PTBdPSJBcnJheSIsdFt0Lk9iamVjdD0xXT0iT2JqZWN0Iix0W3QuUmVhZGFibGVTdHJpbmc9Ml09IlJlYWRhYmxlU3RyaW5nIix0W3QuUmVhZGFibGVPYmplY3Q9M109IlJlYWRhYmxlT2JqZWN0Iix0W3QuUHJpbWl0aXZlPTRdPSJQcmltaXRpdmUiLHRbdC5Qcm9taXNlPTVdPSJQcm9taXNlIn0ocG58fChwbj17fSkpO2xldCB2bj1bXTt2bltwbi5BcnJheV09IlsiLHZuW3BuLk9iamVjdF09InsiLHZuW3BuLlJlYWRhYmxlU3RyaW5nXT0nIicsdm5bcG4uUmVhZGFibGVPYmplY3RdPSJbIjtsZXQgYm49W107Ym5bcG4uQXJyYXldPSJdIixibltwbi5PYmplY3RdPSJ9Iixibltwbi5SZWFkYWJsZVN0cmluZ109JyInLGJuW3BuLlJlYWRhYmxlT2JqZWN0XT0iXSI7bGV0IG1uPVtdO2ZvcihsZXQgdD0wLGU9T2JqZWN0LmVudHJpZXMocG4pO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgcj1lW3RdLG49clswXSxpPXJbMV07Im51bWJlciI9PXR5cGVvZiBpJiYobW5baV09InByb2Nlc3MiK24pfWZ1bmN0aW9uIHduKHQpe3JldHVybiB0LnJlcGxhY2UoZG4sKGZ1bmN0aW9uKHQpe2xldCBlPWduW3RdO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lOiJcXHUiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCwiMCIpfSkpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiciJyt3bih0KSsnIid9ZnVuY3Rpb24gU24odCxlKXtsZXQgcj10LnJlYWQoZSk7cmV0dXJuIG51bGw9PT1yP25ldyBQcm9taXNlKChmdW5jdGlvbihlLHIpe2xldCBuPWZ1bmN0aW9uKCl7cmV0dXJuIGUobnVsbCl9O3Qub25jZSgiZW5kIixuKSx0Lm9uY2UoImVycm9yIixyKSx0Lm9uY2UoInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLG4pLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixyKSxlKHQucmVhZCgpKX0pKX0pKTpQcm9taXNlLnJlc29sdmUocil9ZnVuY3Rpb24gRW4odCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHluKHQpPT09cG4uUHJvbWlzZT9Fbih0KTp0fSkpfWxldCBrbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUscixuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtsZXQgbz10LmNhbGwodGhpcyl8fHRoaXM7by5jeWNsZT1pLG8uc3RhY2s9W10sby5kZXB0aD0wLG8ucHVzaENhbGxlZD0hMSxvLmVuZD0hMSxvLmlzUmVhZGluZz0hMSxvLnJlYWRNb3JlPSExO2xldCBzPXR5cGVvZiBuO3JldHVybiJzdHJpbmciIT09cyYmIm51bWJlciIhPT1zfHwoby5nYXA9TnVtYmVyLmlzRmluaXRlKG4pPyIgIi5yZXBlYXQobik6biksT2JqZWN0LmFzc2lnbihvLHt2aXNpdGVkOmk/bmV3IFdlYWtNYXA6bmV3IFdlYWtTZXQscmVwbGFjZXJGdW5jdGlvbjpyIGluc3RhbmNlb2YgRnVuY3Rpb24mJnIscmVwbGFjZXJBcnJheTpBcnJheS5pc0FycmF5KHIpJiZyfSksciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYoby5yZXBsYWNlckZ1bmN0aW9uPXIpLEFycmF5LmlzQXJyYXkocikmJihvLnJlcGxhY2VyQXJyYXk9ciksby5hZGRUb1N0YWNrKGUpLG99cmV0dXJuIGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9dH1sbih0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KHIucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyByKX0oZSx0KSxlLnByb3RvdHlwZS5jeWNsZXI9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzLnZpc2l0ZWQuZ2V0KGUpO2lmKHIpcmV0dXJueyRyZWY6cn07bGV0IG49dGhpcy5wYXRoKCk7cmV0dXJuIHZvaWQgMCE9PXQmJm4ucHVzaCh0KSxuPW4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4iWyIrKE51bWJlci5pc0ludGVnZXIodCk/dDpfbih0KSkrIl0ifSkpLHRoaXMudmlzaXRlZC5zZXQoZSxuLmxlbmd0aD8iJCIrbi5qb2luKCIiKToiJCIpLGV9LGUucHJvdG90eXBlLmFkZFRvU3RhY2s9ZnVuY3Rpb24odCxlLHIsbil7bGV0IGksbyxzPXRoaXMsYT10O3RoaXMucmVwbGFjZXJGdW5jdGlvbiYmKGE9dGhpcy5yZXBsYWNlckZ1bmN0aW9uKGV8fHIsYSx0aGlzKSksYSYmYS50b0pTT04gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKGE9YS50b0pTT04oKSksKGEgaW5zdGFuY2VvZiBGdW5jdGlvbnx8InN5bWJvbCI9PXR5cGVvZiB0KSYmKGE9dm9pZCAwKSx2b2lkIDAhPT1lJiZ0aGlzLnJlcGxhY2VyQXJyYXkmJih0aGlzLnJlcGxhY2VyQXJyYXkuaW5jbHVkZXMoZSl8fChhPXZvaWQgMCkpO2xldCB1PXluKGEpO2lmKChuJiZuLnR5cGU9PT1wbi5BcnJheXx8dm9pZCAwIT09YSkmJnUhPT1wbi5Qcm9taXNlJiYobiYmIW4uZmlyc3QmJnRoaXMuX3B1c2goIiwiKSxuJiYobi5maXJzdD0hMSkpLHZvaWQgMCE9PWEmJnUhPT1wbi5Qcm9taXNlJiZlJiYodGhpcy5nYXA/dGhpcy5fcHVzaCgiXG4iK3RoaXMuZ2FwLnJlcGVhdCh0aGlzLmRlcHRoKSsnIicrd24oZSkrJyI6ICcpOnRoaXMuX3B1c2goJyInK3duKGUpKyciOicpKSx1IT09cG4uUHJpbWl0aXZlKWlmKHRoaXMuY3ljbGUpYT10aGlzLmN5Y2xlcihlfHxyLGEpLHU9eW4oYSk7ZWxzZXtpZih0aGlzLnZpc2l0ZWQuaGFzKGEpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OIikse3JlYWxWYWx1ZTphLGtleTplfHxyfSk7dGhpcy52aXNpdGVkLmFkZChhKX0hZSYmcj4tMSYmdGhpcy5kZXB0aCYmdGhpcy5nYXAmJnRoaXMuX3B1c2goIlxuIit0aGlzLmdhcC5yZXBlYXQodGhpcy5kZXB0aCkpO2xldCBoPXZuW3VdO2gmJnRoaXMuX3B1c2goaCk7bGV0IGY9e2tleTplLGluZGV4OnIsdHlwZTp1LHBhcmVudDpuLHZhbHVlOmEsZmlyc3Q6ITB9O3JldHVybiB1PT09cG4uT2JqZWN0Pyh0aGlzLmRlcHRoKz0xLGYudW5yZWFkPU9iamVjdC5rZXlzKGEpLGYuaXNFbXB0eT0hZi51bnJlYWQubGVuZ3RoKTp1PT09cG4uQXJyYXk/KHRoaXMuZGVwdGgrPTEsZi51bnJlYWQ9YS5sZW5ndGgsZi5hcnJheUxlbmd0aD1mLnVucmVhZCxmLmlzRW1wdHk9IWYudW5yZWFkKTp1IT09cG4uUmVhZGFibGVTdHJpbmcmJnUhPT1wbi5SZWFkYWJsZU9iamVjdHx8KHRoaXMuZGVwdGgrPTEsYS5yZWFkYWJsZUVuZGVkfHwobnVsbD09PShpPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmVuZEVtaXR0ZWQpP3RoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigiUmVhZGFibGUgU3RyZWFtIGhhcyBlbmRlZCBiZWZvcmUgaXQgd2FzIHNlcmlhbGl6ZWQuIEFsbCBzdHJlYW0gZGF0YSBoYXZlIGJlZW4gbG9zdCIpLGEsZXx8cik6KGEucmVhZGFibGVGbG93aW5nfHwobnVsbD09PShvPWEuX3JlYWRhYmxlU3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmZsb3dpbmcpKSYmKGEucGF1c2UoKSx0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIlJlYWRhYmxlIFN0cmVhbSBpcyBpbiBmbG93aW5nIG1vZGUsIGRhdGEgbWF5IGhhdmUgYmVlbiBsb3N0LiBUcnlpbmcgdG8gcGF1c2Ugc3RyZWFtLiIpLGEsZXx8cikpLGYucmVhZENvdW50PTAsYS5vbmNlKCJlbmQiLChmdW5jdGlvbigpe2YuZW5kPSEwLHMuX19yZWFkKCl9KSksYS5vbmNlKCJlcnJvciIsKGZ1bmN0aW9uKHQpe3MuZXJyb3I9ITAscy5lbWl0KCJlcnJvciIsdCl9KSkpLHRoaXMuc3RhY2sudW5zaGlmdChmKSxmfSxlLnByb3RvdHlwZS5yZW1vdmVGcm9tU3RhY2s9ZnVuY3Rpb24odCl7bGV0IGU9dC50eXBlLHI9ZT09PXBuLk9iamVjdHx8ZT09PXBuLkFycmF5fHxlPT09cG4uUmVhZGFibGVTdHJpbmd8fGU9PT1wbi5SZWFkYWJsZU9iamVjdDtlIT09cG4uUHJpbWl0aXZlJiYodGhpcy5jeWNsZXx8dGhpcy52aXNpdGVkLmRlbGV0ZSh0LnZhbHVlKSxyJiYodGhpcy5kZXB0aC09MSkpO2xldCBuPWJuW2VdO3ImJiF0LmlzRW1wdHkmJnRoaXMuZ2FwJiZ0aGlzLl9wdXNoKCJcbiIrdGhpcy5nYXAucmVwZWF0KHRoaXMuZGVwdGgpKSxuJiZ0aGlzLl9wdXNoKG4pO2xldCBpPXRoaXMuc3RhY2suaW5kZXhPZih0KTt0aGlzLnN0YWNrLnNwbGljZShpLDEpfSxlLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbih0KXt0aGlzLnB1c2hDYWxsZWQ9ITAsdGhpcy5wdXNoKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUmVhZGFibGVPYmplY3Q9ZnVuY3Rpb24odCxlKXtsZXQgcj10aGlzO2lmKCF0LmVuZClyZXR1cm4gU24odC52YWx1ZSxlKS50aGVuKChmdW5jdGlvbihlKXtudWxsIT09ZSYmKHQuZmlyc3R8fHIuX3B1c2goIiwiKSx0LmZpcnN0PSExLHIuYWRkVG9TdGFjayhlLHZvaWQgMCx0LnJlYWRDb3VudCksdC5yZWFkQ291bnQrPTEpfSkpO3RoaXMucmVtb3ZlRnJvbVN0YWNrKHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCF0LnVucmVhZC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVGcm9tU3RhY2sodCk7bGV0IGU9dC51bnJlYWQuc2hpZnQoKSxyPXQudmFsdWVbZV07dGhpcy5hZGRUb1N0YWNrKHIsZSx2b2lkIDAsdCl9LGUucHJvdG90eXBlLnByb2Nlc3NBcnJheT1mdW5jdGlvbih0KXtsZXQgZT10LnVucmVhZDtpZighZSlyZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUZyb21TdGFjayh0KTtsZXQgcj10LmFycmF5TGVuZ3RoLWUsbj10LnZhbHVlW3JdO3QudW5yZWFkLT0xLHRoaXMuYWRkVG9TdGFjayhuLHZvaWQgMCxyLHQpfSxlLnByb3RvdHlwZS5wcm9jZXNzUHJpbWl0aXZlPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQudmFsdWUpe2xldCBlLHI9dHlwZW9mIHQudmFsdWU7c3dpdGNoKHIpe2Nhc2Uic3RyaW5nIjplPV9uKHQudmFsdWUpO2JyZWFrO2Nhc2UibnVtYmVyIjplPU51bWJlci5pc0Zpbml0ZSh0LnZhbHVlKT9TdHJpbmcodC52YWx1ZSk6Im51bGwiO2JyZWFrO2Nhc2UiYm9vbGVhbiI6ZT1TdHJpbmcodC52YWx1ZSk7YnJlYWs7Y2FzZSJvYmplY3QiOnQudmFsdWV8fChlPSJudWxsIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVW5rbm93biB0eXBlICInK3IrJyIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpLHt2YWx1ZTp0LnZhbHVlfSl9dGhpcy5fcHVzaChlKX1lbHNlIXRoaXMuc3RhY2tbMV18fHRoaXMuc3RhY2tbMV0udHlwZSE9PXBuLkFycmF5JiZ0aGlzLnN0YWNrWzFdLnR5cGUhPT1wbi5SZWFkYWJsZU9iamVjdD90LmFkZFNlcGFyYXRvckFmdGVyRW5kPSExOnRoaXMuX3B1c2goIm51bGwiKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1JlYWRhYmxlU3RyaW5nPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dGhpcztpZighdC5lbmQpcmV0dXJuIFNuKHQudmFsdWUsZSkudGhlbigoZnVuY3Rpb24odCl7dCYmci5fcHVzaCh3bih0LnRvU3RyaW5nKCkpKX0pKTt0aGlzLnJlbW92ZUZyb21TdGFjayh0KX0sZS5wcm90b3R5cGUucHJvY2Vzc1Byb21pc2U9ZnVuY3Rpb24odCl7bGV0IGU9dGhpcztyZXR1cm4gRW4odC52YWx1ZSkudGhlbigoZnVuY3Rpb24ocil7ZS5yZW1vdmVGcm9tU3RhY2sodCksZS5hZGRUb1N0YWNrKHIsdC5rZXksdC5pbmRleCx0LnBhcmVudCl9KSl9LGUucHJvdG90eXBlLnByb2Nlc3NTdGFja1RvcEl0ZW09ZnVuY3Rpb24odCl7bGV0IGUscj10aGlzLG49dGhpcy5zdGFja1swXTtpZighbnx8dGhpcy5lcnJvcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dHJ5e2U9dGhpc1ttbltuLnR5cGVdXShuLHQpfWNhdGNoKHQpe3JldHVybiBQcm9taXNlLnJlamVjdCh0KX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7MD09PXIuc3RhY2subGVuZ3RoJiYoci5lbmQ9ITAsci5fcHVzaChudWxsKSl9KSl9LGUucHJvdG90eXBlLl9fcmVhZD1mdW5jdGlvbih0KXtsZXQgZT10aGlzO2lmKCF0aGlzLmlzUmVhZGluZyYmIXRoaXMuZXJyb3IpcmV0dXJuIHRoaXMuaXNSZWFkaW5nPSEwLHRoaXMucmVhZE1vcmU9ITEsdGhpcy5wcm9jZXNzU3RhY2tUb3BJdGVtKHQpLnRoZW4oKGZ1bmN0aW9uKCl7IWUuZW5kJiYhZS5lcnJvciYmKGUucmVhZE1vcmV8fCFlLnB1c2hDYWxsZWQpP3VyKChmdW5jdGlvbigpe2UuaXNSZWFkaW5nPSExLGUuX19yZWFkKCl9KSk6ZS5pc1JlYWRpbmc9ITF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe2UuZXJyb3I9ITAsZS5lbWl0KCJlcnJvciIsdCl9KSk7dGhpcy5yZWFkTW9yZT0hMH0sZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24odCl7dGhpcy5wdXNoQ2FsbGVkPSExLHRoaXMuX19yZWFkKHQpfSxlLnByb3RvdHlwZS5wYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhY2subWFwKChmdW5jdGlvbih0KXtsZXQgZT10LmtleSxyPXQuaW5kZXg7cmV0dXJuIGV8fHJ9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdHx8dD4tMX0pKS5yZXZlcnNlKCl9LGV9KHBlKTt2YXIgUm49QXJyYXkuaXNBcnJheSxBbj0ib2JqZWN0Ij09dHlwZW9mIEhlJiZIZSYmSGUuT2JqZWN0PT09T2JqZWN0JiZIZSxUbj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLE9uPUFufHxUbnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxqbj1Pbi5TeW1ib2wsTG49T2JqZWN0LnByb3RvdHlwZSxDbj1Mbi5oYXNPd25Qcm9wZXJ0eSxQbj1Mbi50b1N0cmluZyxNbj1qbj9qbi50b1N0cmluZ1RhZzp2b2lkIDA7dmFyIEJuPWZ1bmN0aW9uKHQpe3ZhciBlPUNuLmNhbGwodCxNbikscj10W01uXTt0cnl7dFtNbl09dm9pZCAwO3ZhciBuPSEwfWNhdGNoKHQpe312YXIgaT1Qbi5jYWxsKHQpO3JldHVybiBuJiYoZT90W01uXT1yOmRlbGV0ZSB0W01uXSksaX0seG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgVW49ZnVuY3Rpb24odCl7cmV0dXJuIHhuLmNhbGwodCl9LEluPWpuP2puLnRvU3RyaW5nVGFnOnZvaWQgMDt2YXIgRG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6SW4mJkluIGluIE9iamVjdCh0KT9Cbih0KTpVbih0KX07dmFyIE5uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9O3ZhciBGbj1mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE5uKHQpJiYiW29iamVjdCBTeW1ib2xdIj09RG4odCl9LHpuPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHFuPS9eXHcqJC87dmFyIFluPWZ1bmN0aW9uKHQsZSl7aWYoUm4odCkpcmV0dXJuITE7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9ciYmInN5bWJvbCIhPXImJiJib29sZWFuIiE9ciYmbnVsbCE9dCYmIUZuKHQpKXx8KHFuLnRlc3QodCl8fCF6bi50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE9iamVjdChlKSl9O3ZhciBXbj1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX07dmFyICRuLEduPWZ1bmN0aW9uKHQpe2lmKCFXbih0KSlyZXR1cm4hMTt2YXIgZT1Ebih0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEpuPU9uWyJfX2NvcmUtanNfc2hhcmVkX18iXSxIbj0oJG49L1teLl0rJC8uZXhlYyhKbiYmSm4ua2V5cyYmSm4ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iKyRuOiIiO3ZhciBWbj1mdW5jdGlvbih0KXtyZXR1cm4hIUhuJiZIbiBpbiB0fSxLbj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFpuPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gS24uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LFFuPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLFhuPUZ1bmN0aW9uLnByb3RvdHlwZSx0aT1PYmplY3QucHJvdG90eXBlLGVpPVhuLnRvU3RyaW5nLHJpPXRpLmhhc093blByb3BlcnR5LG5pPVJlZ0V4cCgiXiIrZWkuY2FsbChyaSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIGlpPWZ1bmN0aW9uKHQpe3JldHVybiEoIVduKHQpfHxWbih0KSkmJihHbih0KT9uaTpRbikudGVzdChabih0KSl9O3ZhciBvaT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgc2k9ZnVuY3Rpb24odCxlKXt2YXIgcj1vaSh0LGUpO3JldHVybiBpaShyKT9yOnZvaWQgMH0sYWk9c2koT2JqZWN0LCJjcmVhdGUiKTt2YXIgdWk9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPWFpP2FpKG51bGwpOnt9LHRoaXMuc2l6ZT0wfTt2YXIgaGk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LGZpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGNpPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoYWkpe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gZmkuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxsaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBhaT92b2lkIDAhPT1lW3RdOmxpLmNhbGwoZSx0KX07dmFyIGRpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1haSYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiBnaSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1naS5wcm90b3R5cGUuY2xlYXI9dWksZ2kucHJvdG90eXBlLmRlbGV0ZT1oaSxnaS5wcm90b3R5cGUuZ2V0PWNpLGdpLnByb3RvdHlwZS5oYXM9cGksZ2kucHJvdG90eXBlLnNldD1kaTt2YXIgeWk9Z2k7dmFyIHZpPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH07dmFyIGJpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfTt2YXIgbWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZihiaSh0W3JdWzBdLGUpKXJldHVybiByO3JldHVybi0xfSx3aT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBfaT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bWkoZSx0KTtyZXR1cm4hKHI8MCkmJihyPT1lLmxlbmd0aC0xP2UucG9wKCk6d2kuY2FsbChlLHIsMSksLS10aGlzLnNpemUsITApfTt2YXIgU2k9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPW1pKGUsdCk7cmV0dXJuIHI8MD92b2lkIDA6ZVtyXVsxXX07dmFyIEVpPWZ1bmN0aW9uKHQpe3JldHVybiBtaSh0aGlzLl9fZGF0YV9fLHQpPi0xfTt2YXIga2k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fLG49bWkocix0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxyLnB1c2goW3QsZV0pKTpyW25dWzFdPWUsdGhpc307ZnVuY3Rpb24gUmkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19UmkucHJvdG90eXBlLmNsZWFyPXZpLFJpLnByb3RvdHlwZS5kZWxldGU9X2ksUmkucHJvdG90eXBlLmdldD1TaSxSaS5wcm90b3R5cGUuaGFzPUVpLFJpLnByb3RvdHlwZS5zZXQ9a2k7dmFyIEFpPVJpLFRpPXNpKE9uLCJNYXAiKTt2YXIgT2k9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB5aSxtYXA6bmV3KFRpfHxBaSksc3RyaW5nOm5ldyB5aX19O3ZhciBqaT1mdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fTt2YXIgTGk9ZnVuY3Rpb24odCxlKXt2YXIgcj10Ll9fZGF0YV9fO3JldHVybiBqaShlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfTt2YXIgQ2k9ZnVuY3Rpb24odCl7dmFyIGU9TGkodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX07dmFyIFBpPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmdldCh0KX07dmFyIE1pPWZ1bmN0aW9uKHQpe3JldHVybiBMaSh0aGlzLHQpLmhhcyh0KX07dmFyIEJpPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TGkodGhpcyx0KSxuPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bj8wOjEsdGhpc307ZnVuY3Rpb24geGkodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8cjspe3ZhciBuPXRbZV07dGhpcy5zZXQoblswXSxuWzFdKX19eGkucHJvdG90eXBlLmNsZWFyPU9pLHhpLnByb3RvdHlwZS5kZWxldGU9Q2kseGkucHJvdG90eXBlLmdldD1QaSx4aS5wcm90b3R5cGUuaGFzPU1pLHhpLnByb3RvdHlwZS5zZXQ9Qmk7dmFyIFVpPXhpO2Z1bmN0aW9uIElpKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgcj1mdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLG4pOm5bMF0sbz1yLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMsbik7cmV0dXJuIHIuY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gci5jYWNoZT1uZXcoSWkuQ2FjaGV8fFVpKSxyfUlpLkNhY2hlPVVpO3ZhciBEaT1JaTt2YXIgTmk9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csRmk9L1xcKFxcKT8vZyx6aT1mdW5jdGlvbih0KXt2YXIgZT1EaSh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09ci5zaXplJiZyLmNsZWFyKCksdH0pKSxyPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKE5pLChmdW5jdGlvbih0LHIsbixpKXtlLnB1c2gobj9pLnJlcGxhY2UoRmksIiQxIik6cnx8dCl9KSksZX0pKTt2YXIgcWk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShuKTsrK3I8bjspaVtyXT1lKHRbcl0scix0KTtyZXR1cm4gaX0sWWk9am4/am4ucHJvdG90eXBlOnZvaWQgMCxXaT1ZaT9ZaS50b1N0cmluZzp2b2lkIDA7dmFyICRpPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKFJuKGUpKXJldHVybiBxaShlLHQpKyIiO2lmKEZuKGUpKXJldHVybiBXaT9XaS5jYWxsKGUpOiIiO3ZhciByPWUrIiI7cmV0dXJuIjAiPT1yJiYxL2U9PS1JbmZpbml0eT8iLTAiOnJ9O3ZhciBHaT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjokaSh0KX07dmFyIEppPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJuKHQpP3Q6WW4odCxlKT9bdF06emkoR2kodCkpfTt2YXIgSGk9ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxGbih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfTt2YXIgVmk9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9MCxuPShlPUppKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPG47KXQ9dFtIaShlW3IrK10pXTtyZXR1cm4gciYmcj09bj90OnZvaWQgMH07dmFyIEtpPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1udWxsPT10P3ZvaWQgMDpWaSh0LGUpO3JldHVybiB2b2lkIDA9PT1uP3I6bn07dmFyIFppPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8Tm4odCkmJiJbb2JqZWN0IE51bWJlcl0iPT1Ebih0KX07ZnVuY3Rpb24gUWkodCl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gWGkodCl7cmV0dXJuISghUWkodCl8fCIiPT09dCl9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBlbyh0KXtyZXR1cm4iW29iamVjdCBVbmRlZmluZWRdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBubyh0KXtyZXR1cm4hKCFRaSh0KXx8IiIhPT10KX1mdW5jdGlvbiBpbyh0KXtyZXR1cm4hIWVvKHQpfHwoISFmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdWxsXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KHQpfHwoISFmdW5jdGlvbih0KXtpZihybyh0KSl7Zm9yKGxldCBlIGluIHQpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9KHQpfHwoISFubyh0KXx8ISFmdW5jdGlvbih0KXtyZXR1cm4hIXRvKHQpJiYwPT09dC5sZW5ndGh9KHQpKSkpfWZ1bmN0aW9uIG9vKCl7bGV0IHQsZSxyPW5ldyBQcm9taXNlKChmdW5jdGlvbigpe3Q9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdfSkpO3JldHVybiByLnJlc29sdmU9dCxyLnJlamVjdD1lLHJ9bGV0IFdKc29uU3RyZWFtPXtwYXJzZTphc3luYyBmdW5jdGlvbih0KXtpZighWGkodCkpcmV0dXJue307bGV0IGU9e307dHJ5e2U9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtlPXt9fXJldHVybiBlfSxwYXJzZUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPXt9O2lmKCJudWxsIj09PXQpcmV0dXJuIG51bGw7aWYoIiI9PT10KXJldHVybnt9O2xldCByPSJfX3N5c3RlbV9fIixuPWB7Il9fc3lzdGVtX18iOiR7dH19YCxpPW9vKCksbz15cihuKSxzPWNuLnBhcnNlKCIkKiIpO3JldHVybiBzLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZVt0LmtleV09dC52YWx1ZX0pKSxzLm9uKCJlbmQiLChmdW5jdGlvbigpe2xldCB0PUtpKGUscik7aS5yZXNvbHZlKHQpfSkpLHMub24oImVycm9yIiwoZnVuY3Rpb24odCl7aS5yZWplY3QodCl9KSksby5waXBlKHMpLGl9LGNyZWF0ZVBhcnNlU3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBYaSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISghdG8odCl8fDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZpbyh0WzBdKSl9KHQpfHwodD0iJCoiKSxjbi5wYXJzZSh0KX0sc3RyaW5naWZ5OmFzeW5jIGZ1bmN0aW9uKHQpe2lmKGVvKHQpKXJldHVybiIiO2xldCBlPSIiO3RyeXtlPUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe2U9IiJ9cmV0dXJuIGV9LHN0cmluZ2lmeUJ5U3RyZWFtOmZ1bmN0aW9uKHQpe2xldCBlPSIiO2lmKGVvKHQpKXJldHVybiIiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZihubyh0KSlyZXR1cm4nIiInO2lmKFppKHQpKXJldHVybmAke3R9YDtpZihRaSh0KSlyZXR1cm5gIiR7dH0iYDtsZXQgcj1vbygpLG49bmV3IGtuKHQsbnVsbCxudWxsLCExKTtyZXR1cm4gbi5vbigiZGF0YSIsKGZ1bmN0aW9uKHQpe2UrPXR9KSksbi5vbigiZW5kIiwoZnVuY3Rpb24oKXtyLnJlc29sdmUoZSl9KSksbi5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtyLnJlamVjdCh0KX0pKSxyfSxjcmVhdGVTdHJpbmdpZnlTdHJlYW06ZnVuY3Rpb24odCl7aWYoIXJvKHQpJiYhdG8odCkpdGhyb3cgbmV3IEVycm9yKCJkYXRhIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXkiKTtyZXR1cm4gbmV3IGtuKHQsbnVsbCxudWxsLCExKX19OwoKbGV0IGluc3RhbmNlID0gbnVsbApmdW5jdGlvbiBpbml0KGlucHV0KXsKCiAgICAvL2luaXQKICAgIGxldCByCiAgICAKICAgICAgICByID0gV0pzb25TdHJlYW0oLi4uaW5wdXQpCiAgICAgICAgCgogICAgLy9vbgogICAgCgogICAgLy9zYXZlCiAgICBpbnN0YW5jZSA9IHIKCn0KCmZ1bmN0aW9uIHNlbmRNZXNzYWdlKGRhdGEpIHsKICAgIAogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSkKICAgICAgICAKfQoKYXN5bmMgZnVuY3Rpb24gcnVuKGRhdGEpIHsKICAgIC8vIGNvbnNvbGUubG9nKCdpbm5lciB3b3JrZXIgcnVuJyxkYXRhKQoKICAgIC8vbW9kZQogICAgbGV0IG1vZGUgPSBkYXRhLm1vZGUKCiAgICAvL2NoZWNrCiAgICBpZihtb2RlICE9PSAnaW5pdCcgJiYgbW9kZSAhPT0gJ2NhbGwnKXsKICAgICAgICByZXR1cm4KICAgIH0KCiAgICAvL2luaXQKICAgIGlmKG1vZGUgPT09ICdpbml0Jyl7CiAgICAgICAgCiAgICAgICAgdHJ5ewoKICAgICAgICAgICAgLy90eXBlCiAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKICAgIAogICAgICAgICAgICAvL2luc3RhbmNlCiAgICAgICAgICAgIGlmKHR5cGUgPT09ICdmdW5jdGlvbicpewogICAgICAgICAgICAgICAgaW5pdCguLi5pbnB1dCkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKHR5cGUgPT09ICdvYmplY3QnKXsKICAgICAgICAgICAgICAgIGluc3RhbmNlID0gV0pzb25TdHJlYW0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgY2F0Y2goZXJyKXsKICAgICAgICAKICAgICAgICAgICAgLy9zZW5kTWVzc2FnZQogICAgICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICAgICAgbW9kZTogJ2VtaXQnLAogICAgICAgICAgICAgICAgZXZOYW1lOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbXNnOiBlcnIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZE1lc3NhZ2UocmVzKQoKICAgICAgICB9CiAgICAgICAgICAgIAogICAgfQoKICAgIC8vY2hlY2sKICAgIGlmKG1vZGUgPT09ICdjYWxsJyl7CiAgICAgICAgbGV0IHN0YXRlID0gJycKICAgICAgICBsZXQgbXNnID0gbnVsbAoKICAgICAgICB0cnl7CgogICAgICAgICAgICAvL2Z1bgogICAgICAgICAgICBsZXQgZnVuID0gaW5zdGFuY2VbZGF0YS5mdW5dCgogICAgICAgICAgICAvL2lucHV0CiAgICAgICAgICAgIGxldCBpbnB1dCA9IGRhdGEuaW5wdXQKCiAgICAgICAgICAgIC8vZXhlYwogICAgICAgICAgICBhd2FpdCBmdW4oLi4uaW5wdXQpCiAgICAgICAgICAgICAgICAudGhlbigoc3VjKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J3N1Y2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgbXNnPXN1YwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGU9J2Vycm9yJwogICAgICAgICAgICAgICAgICAgIG1zZz1lcnIKICAgICAgICAgICAgICAgIH0pCgogICAgICAgIH0KICAgICAgICBjYXRjaChlcnIpewogICAgICAgICAgICBzdGF0ZSA9ICdlcnJvcicKICAgICAgICAgICAgbXNnID0gZXJyCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vc2VuZE1lc3NhZ2UKICAgICAgICBsZXQgcmVzID0gewogICAgICAgICAgICBtb2RlOiAncmV0dXJuJywKICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgIGZ1bjogZGF0YS5mdW4sCiAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICBtc2csCiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKHJlcykKCiAgICB9Cgp9CgpmdW5jdGlvbiByZWN2TWVzc2FnZShkYXRhKSB7CiAgICAvLyBjb25zb2xlLmxvZygnaW5uZXIgd29ya2VyIHJlY3Y6JywgZGF0YSkKCiAgICAvL2RhdGFSZWN2CiAgICBsZXQgZGF0YVJlY3YgPSBkYXRhCgogICAgLy9ydW4KICAgIHJ1bihkYXRhUmVjdikKCn0KCgogICAgICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmVjdk1lc3NhZ2UoZS5kYXRhKQogICAgICAgIH0KICAgICAgICAKCg==");function G(){var Z=l();function c(l){try{var Z=new Blob([l]),d=window.URL||window.webkitURL;return new Worker(d.createObjectURL(Z))}catch(l){I(l)}}var G=c(b);if(!G)return I("invalid worker"),null;function X(){G?(G.terminate(),G=void 0):I("worker has been terminated")}function i(){var l={mode:"init",type:"object",input:Array.prototype.slice.call(arguments)};G.postMessage(l)}function W(){var l=d(),c=m(),b={mode:"call",id:c,fun:"stringify",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function u(){var l=d(),c=m(),b={mode:"call",id:c,fun:"parse",input:Array.prototype.slice.call(arguments)};return G.postMessage(b),Z.once(c,(function(Z){"success"===Z.state?l.resolve(Z.msg):l.reject(Z.msg)})),l}function y(l){var d=l,m=d.mode;"emit"!==m&&"return"!==m||("emit"===m&&Z.emit(d.evName,d.msg),"return"===m&&Z.emit(d.id,d))}function I(l){Z.emit("error",l)}return G.onmessage=function(l){y(l.data)},G.onerror=I,i(Array.prototype.slice.call(arguments)),Z.stringify=W,Z.parse=u,Z.terminate=X,Z}var X,u,y={stringify:(u=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.stringify.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return u.apply(this,arguments)}),parse:(X=c(W.mark((function l(){var d,m,c,b=arguments;return W.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return d=Array.prototype.slice.call(b),m=G(),l.next=4,m.parse.apply(m,Z(d)).finally((function(){m.terminate()}));case 4:return c=l.sent,l.abrupt("return",c);case 6:case"end":return l.stop()}}),l)}))),function(){return X.apply(this,arguments)})};for(var I in i=l(),y){var p=y[I];i[I]=p}}(),i}()}));return"undefined"!=typeof window&&void 0!==window.document?G:b}));