- Albert Einstein":e===c.Failure?n="\"Failure is simply the opportunity to begin again, this time more intelligently.\"
- Henry Ford":e===c.Warning?n="\"The peoples who want to live comfortably without producing and fatigue; they are doomed to lose their dignity, then liberty, and then independence and destiny.\"
- Mustafa Kemal Ataturk":e===c.Info&&(n="\"Knowledge rests not upon truth alone, but upon error also.\"
- Carl Gustav Jung")),"string"!=typeof o&&(o="Okay"),i.plainText&&(a=N(a),n=N(n),o=N(o)),i.plainText||(a.length>i.titleMaxLength&&(a="Possible HTML Tags Error",n="The \"plainText\" option is \"false\" and the title content length is more than the \"titleMaxLength\" option.",o="Okay"),n.length>i.messageMaxLength&&(a="Possible HTML Tags Error",n="The \"plainText\" option is \"false\" and the message content length is more than the \"messageMaxLength\" option.",o="Okay"),o.length>i.buttonMaxLength&&(a="Possible HTML Tags Error",n="The \"plainText\" option is \"false\" and the button content length is more than the \"buttonMaxLength\" option.",o="Okay")),a.length>i.titleMaxLength&&(a=a.substring(0,i.titleMaxLength)+"..."),n.length>i.messageMaxLength&&(n=n.substring(0,i.messageMaxLength)+"..."),o.length>i.buttonMaxLength&&(o=o.substring(0,i.buttonMaxLength)+"..."),i.cssAnimation||(i.cssAnimationDuration=0);var x=t.document.createElement("div");x.id=p.ID,x.className=i.className,x.style.zIndex=i.zindex,x.style.borderRadius=i.borderRadius,x.style.fontFamily="\""+i.fontFamily+"\", "+s,i.rtl&&(x.setAttribute("dir","rtl"),x.classList.add("nx-rtl-on")),x.style.display="flex",x.style.flexWrap="wrap",x.style.flexDirection="column",x.style.alignItems="center",x.style.justifyContent="center";var g="",b=!0===i.backOverlayClickToClose;i.backOverlay&&(g="");var u="";if(e===c.Success?u=C(i.svgSize,d.svgColor):e===c.Failure?u=z(i.svgSize,d.svgColor):e===c.Warning?u=S(i.svgSize,d.svgColor):e===c.Info&&(u=L(i.svgSize,d.svgColor)),x.innerHTML=g+"
"),n.cssAnimation||(n.cssAnimationDuration=0);var f="";if(e===x.Standard)f=W(n.svgSize,n.svgColor);else if(e===x.Hourglass)f=I(n.svgSize,n.svgColor);else if(e===x.Circle)f=R(n.svgSize,n.svgColor);else if(e===x.Arrows)f=A(n.svgSize,n.svgColor);else if(e===x.Dots)f=M(n.svgSize,n.svgColor);else if(e===x.Pulse)f=B(n.svgSize,n.svgColor);else if(e===x.Custom&&null!==n.customSvgCode&&null===n.customSvgUrl)f=n.customSvgCode||"";else if(e===x.Custom&&null!==n.customSvgUrl&&null===n.customSvgCode)f="";else{if(e===x.Custom&&(null===n.customSvgUrl||null===n.customSvgCode))return y("You have to set a static SVG url to \"customSvgUrl\" option to use Loading Custom."),!1;f=X(n.svgSize,"#f8f8f8","#32c682")}var d=parseInt((n.svgSize||"").replace(/[^0-9]/g,"")),b=t.innerWidth,u=d>=b?b-40+"px":d+"px",k="
"+f+"
",h=t.document.createElement("div");if(h.id=g.ID,h.className=n.className+(n.cssAnimation?" nx-with-animation":"")+(n.clickToClose?" nx-loading-click-to-close":""),h.style.zIndex=n.zindex,h.style.background=n.backgroundColor,h.style.animationDuration=n.cssAnimationDuration+"ms",h.style.fontFamily="\""+n.fontFamily+"\", "+s,h.style.display="flex",h.style.flexWrap="wrap",h.style.flexDirection="column",h.style.alignItems="center",h.style.justifyContent="center",n.rtl&&(h.setAttribute("dir","rtl"),h.classList.add("nx-rtl-on")),h.innerHTML=k+p,!t.document.getElementById(h.id)&&(t.document.body.appendChild(h),n.clickToClose)){var C=t.document.getElementById(h.id);C.addEventListener("click",function(){h.classList.add("nx-remove");var t=setTimeout(function(){null!==h.parentNode&&(h.parentNode.removeChild(h),clearTimeout(t))},n.cssAnimationDuration)})}}else if(t.document.getElementById(g.ID))var z=t.document.getElementById(g.ID),S=setTimeout(function(){z.classList.add("nx-remove");var t=setTimeout(function(){null!==z.parentNode&&(z.parentNode.removeChild(z),clearTimeout(t))},n.cssAnimationDuration);clearTimeout(S)},r);n=v(!0,n,l)},V=function(e){"string"!=typeof e&&(e="");var i=t.document.getElementById(g.ID);if(i)if(0n.messageMaxLength?N(e).substring(0,n.messageMaxLength)+"...":N(e);var a=i.getElementsByTagName("p")[0];if(a)a.innerHTML=e;else{var o=t.document.createElement("p");o.id=n.messageID,o.className="nx-loading-message nx-loading-message-new",o.style.color=n.messageColor,o.style.fontSize=n.messageFontSize,o.innerHTML=e,i.appendChild(o)}}else y("Where is the new message?")},q=function(){return"[id^=NotiflixBlockWrap]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;z-index:1000;font-family:\"Quicksand\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;background:rgba(255,255,255,.9);text-align:center;animation-duration:.4s;width:100%;height:100%;left:0;top:0;border-radius:inherit;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}[id^=NotiflixBlockWrap] *{-webkit-box-sizing:border-box;box-sizing:border-box}[id^=NotiflixBlockWrap]>span[class*=\"-icon\"]{display:block;width:45px;height:45px;position:relative;margin:0 auto}[id^=NotiflixBlockWrap]>span[class*=\"-icon\"] svg{width:inherit;height:inherit}[id^=NotiflixBlockWrap]>span[class*=\"-message\"]{position:relative;display:block;width:100%;margin:10px auto 0;padding:0 10px;font-family:inherit!important;font-weight:normal;font-size:14px;line-height:1.4}[id^=NotiflixBlockWrap].nx-with-animation{-webkit-animation:block-animation-fade .3s ease-in-out 0s normal;animation:block-animation-fade .3s ease-in-out 0s normal}@-webkit-keyframes block-animation-fade{0%{opacity:0}100%{opacity:1}}@keyframes block-animation-fade{0%{opacity:0}100%{opacity:1}}[id^=NotiflixBlockWrap].nx-with-animation.nx-remove{opacity:0;-webkit-animation:block-animation-fade-remove .3s ease-in-out 0s normal;animation:block-animation-fade-remove .3s ease-in-out 0s normal}@-webkit-keyframes block-animation-fade-remove{0%{opacity:1}100%{opacity:0}}@keyframes block-animation-fade-remove{0%{opacity:1}100%{opacity:0}}"},Q=0,Y=function(e,i,a,n,r,l){var m;if(Array.isArray(a)){if(1>a.length)return y("Array of HTMLElements should contains at least one HTMLElement."),!1;m=a}else if(Object.prototype.isPrototypeOf.call(NodeList.prototype,a)){if(1>a.length)return y("NodeListOf should contains at least one HTMLElement."),!1;m=Array.prototype.slice.call(a)}else{var c="string"!=typeof a||1>(a||"").length||1===(a||"").length&&("#"===(a||"")[0]||"."===(a||"")[0]);if(c)return y("The selector parameter must be a string and matches a specified CSS selector(s)."),!1;var p=t.document.querySelectorAll(a);if(1>p.length)return y("You called the \"Notiflix.Block...\" function with \""+a+"\" selector, but there is no such element(s) in the document."),!1;m=p}o||G.Block.init({});var f=v(!0,o,{});if("object"==typeof n&&!Array.isArray(n)||"object"==typeof r&&!Array.isArray(r)){var d={};"object"==typeof n?d=n:"object"==typeof r&&(d=r),o=v(!0,o,d)}var x="";"string"==typeof n&&0=h?h:m.length,z="nx-block-temporary-position";if(e){for(var S,L=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","html","head","title","script","style","iframe"],X=0;XD.length){var T="";i&&(i===b.Hourglass?T=I(o.svgSize,o.svgColor):i===b.Circle?T=R(o.svgSize,o.svgColor):i===b.Arrows?T=A(o.svgSize,o.svgColor):i===b.Dots?T=M(o.svgSize,o.svgColor):i===b.Pulse?T=B(o.svgSize,o.svgColor):T=W(o.svgSize,o.svgColor));var F=""+T+"",E="";0o.messageMaxLength?N(x).substring(0,o.messageMaxLength)+"...":N(x),E=""+x+""),Q++;var j=t.document.createElement("div");j.id=u.ID+"-"+Q,j.className=g+(o.cssAnimation?" nx-with-animation":""),j.style.position=o.position,j.style.zIndex=o.zindex,j.style.background=o.backgroundColor,j.style.animationDuration=o.cssAnimationDuration+"ms",j.style.fontFamily="\""+o.fontFamily+"\", "+s,j.style.display="flex",j.style.flexWrap="wrap",j.style.flexDirection="column",j.style.alignItems="center",j.style.justifyContent="center",o.rtl&&(j.setAttribute("dir","rtl"),j.classList.add("nx-rtl-on")),j.innerHTML=F+E;var O=t.getComputedStyle(S).getPropertyValue("position"),H="string"==typeof O?O.toLocaleLowerCase("en"):"relative",P=Math.round(1.25*parseInt(o.svgSize))+40,U=S.offsetHeight||0,V="";P>U&&(V="min-height:"+P+"px;");var q="";q=S.getAttribute("id")?"#"+S.getAttribute("id"):S.classList[0]?"."+S.classList[0]:(S.tagName||"").toLocaleLowerCase("en");var Y="",K=-1>=["absolute","relative","fixed","sticky"].indexOf(H);if(K||0"+q+"."+z+"{"+Y+V+"}",J=t.document.createRange();J.selectNode(t.document.head);var Z=J.createContextualFragment($);t.document.head.appendChild(Z),S.classList.add(z)}S.appendChild(j)}}}else var _=function(e){var i=setTimeout(function(){null!==e.parentNode&&e.parentNode.removeChild(e);var a=e.getAttribute("id"),n=t.document.getElementById("Style-"+a);n&&null!==n.parentNode&&n.parentNode.removeChild(n),clearTimeout(i)},o.cssAnimationDuration)},tt=function(t){if(t&&0\" or \"NodeListOf\" does not have a \"Block\" element to remove.")},et=function(t){var e=setTimeout(function(){t.classList.remove(z),clearTimeout(e)},o.cssAnimationDuration+300)},it=setTimeout(function(){for(var t,e=0;e {
"use strict";
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
module.exports = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
/***/ }),
/***/ "../../../node_modules/object-inspect/index.js":
/*!*****************************************************!*\
!*** ../../../node_modules/object-inspect/index.js ***!
\*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
? Symbol.toStringTag
: null;
var isEnumerable = Object.prototype.propertyIsEnumerable;
var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
[].__proto__ === Array.prototype // eslint-disable-line no-proto
? function (O) {
return O.__proto__; // eslint-disable-line no-proto
}
: null
);
function addNumericSeparator(num, str) {
if (
num === Infinity
|| num === -Infinity
|| num !== num
|| (num && num > -1000 && num < 1000)
|| $test.call(/e/, str)
) {
return str;
}
var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
if (typeof num === 'number') {
var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
if (int !== num) {
var intStr = String(int);
var dec = $slice.call(str, intStr.length + 1);
return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
}
}
return $replace.call(str, sepRegex, '$&_');
}
var utilInspect = __webpack_require__(/*! ./util.inspect */ "?4860");
var inspectCustom = utilInspect.custom;
var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;
var quotes = {
__proto__: null,
'double': '"',
single: "'"
};
var quoteREs = {
__proto__: null,
'double': /(["\\])/g,
single: /(['\\])/g
};
module.exports = function inspect_(obj, options, depth, seen) {
var opts = options || {};
if (has(opts, 'quoteStyle') && !has(quotes, opts.quoteStyle)) {
throw new TypeError('option "quoteStyle" must be "single" or "double"');
}
if (
has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
: opts.maxStringLength !== null
)
) {
throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
}
var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
}
if (
has(opts, 'indent')
&& opts.indent !== null
&& opts.indent !== '\t'
&& !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
) {
throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
}
if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
}
var numericSeparator = opts.numericSeparator;
if (typeof obj === 'undefined') {
return 'undefined';
}
if (obj === null) {
return 'null';
}
if (typeof obj === 'boolean') {
return obj ? 'true' : 'false';
}
if (typeof obj === 'string') {
return inspectString(obj, opts);
}
if (typeof obj === 'number') {
if (obj === 0) {
return Infinity / obj > 0 ? '0' : '-0';
}
var str = String(obj);
return numericSeparator ? addNumericSeparator(obj, str) : str;
}
if (typeof obj === 'bigint') {
var bigIntStr = String(obj) + 'n';
return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
}
var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
if (typeof depth === 'undefined') { depth = 0; }
if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
return isArray(obj) ? '[Array]' : '[Object]';
}
var indent = getIndent(opts, depth);
if (typeof seen === 'undefined') {
seen = [];
} else if (indexOf(seen, obj) >= 0) {
return '[Circular]';
}
function inspect(value, from, noIndent) {
if (from) {
seen = $arrSlice.call(seen);
seen.push(from);
}
if (noIndent) {
var newOpts = {
depth: opts.depth
};
if (has(opts, 'quoteStyle')) {
newOpts.quoteStyle = opts.quoteStyle;
}
return inspect_(value, newOpts, depth + 1, seen);
}
return inspect_(value, opts, depth + 1, seen);
}
if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
var name = nameOf(obj);
var keys = arrObjKeys(obj, inspect);
return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
}
if (isSymbol(obj)) {
var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
}
if (isElement(obj)) {
var s = '<' + $toLowerCase.call(String(obj.nodeName));
var attrs = obj.attributes || [];
for (var i = 0; i < attrs.length; i++) {
s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
}
s += '>';
if (obj.childNodes && obj.childNodes.length) { s += '...'; }
s += '' + $toLowerCase.call(String(obj.nodeName)) + '>';
return s;
}
if (isArray(obj)) {
if (obj.length === 0) { return '[]'; }
var xs = arrObjKeys(obj, inspect);
if (indent && !singleLineValues(xs)) {
return '[' + indentedJoin(xs, indent) + ']';
}
return '[ ' + $join.call(xs, ', ') + ' ]';
}
if (isError(obj)) {
var parts = arrObjKeys(obj, inspect);
if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
}
if (parts.length === 0) { return '[' + String(obj) + ']'; }
return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
}
if (typeof obj === 'object' && customInspect) {
if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
return utilInspect(obj, { depth: maxDepth - depth });
} else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
return obj.inspect();
}
}
if (isMap(obj)) {
var mapParts = [];
if (mapForEach) {
mapForEach.call(obj, function (value, key) {
mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
});
}
return collectionOf('Map', mapSize.call(obj), mapParts, indent);
}
if (isSet(obj)) {
var setParts = [];
if (setForEach) {
setForEach.call(obj, function (value) {
setParts.push(inspect(value, obj));
});
}
return collectionOf('Set', setSize.call(obj), setParts, indent);
}
if (isWeakMap(obj)) {
return weakCollectionOf('WeakMap');
}
if (isWeakSet(obj)) {
return weakCollectionOf('WeakSet');
}
if (isWeakRef(obj)) {
return weakCollectionOf('WeakRef');
}
if (isNumber(obj)) {
return markBoxed(inspect(Number(obj)));
}
if (isBigInt(obj)) {
return markBoxed(inspect(bigIntValueOf.call(obj)));
}
if (isBoolean(obj)) {
return markBoxed(booleanValueOf.call(obj));
}
if (isString(obj)) {
return markBoxed(inspect(String(obj)));
}
// note: in IE 8, sometimes `global !== window` but both are the prototypes of each other
/* eslint-env browser */
if (typeof window !== 'undefined' && obj === window) {
return '{ [object Window] }';
}
if (
(typeof globalThis !== 'undefined' && obj === globalThis)
|| (typeof __webpack_require__.g !== 'undefined' && obj === __webpack_require__.g)
) {
return '{ [object globalThis] }';
}
if (!isDate(obj) && !isRegExp(obj)) {
var ys = arrObjKeys(obj, inspect);
var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
var protoTag = obj instanceof Object ? '' : 'null prototype';
var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
if (ys.length === 0) { return tag + '{}'; }
if (indent) {
return tag + '{' + indentedJoin(ys, indent) + '}';
}
return tag + '{ ' + $join.call(ys, ', ') + ' }';
}
return String(obj);
};
function wrapQuotes(s, defaultStyle, opts) {
var style = opts.quoteStyle || defaultStyle;
var quoteChar = quotes[style];
return quoteChar + s + quoteChar;
}
function quote(s) {
return $replace.call(String(s), /"/g, '"');
}
function canTrustToString(obj) {
return !toStringTag || !(typeof obj === 'object' && (toStringTag in obj || typeof obj[toStringTag] !== 'undefined'));
}
function isArray(obj) { return toStr(obj) === '[object Array]' && canTrustToString(obj); }
function isDate(obj) { return toStr(obj) === '[object Date]' && canTrustToString(obj); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && canTrustToString(obj); }
function isError(obj) { return toStr(obj) === '[object Error]' && canTrustToString(obj); }
function isString(obj) { return toStr(obj) === '[object String]' && canTrustToString(obj); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && canTrustToString(obj); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && canTrustToString(obj); }
// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
if (hasShammedSymbols) {
return obj && typeof obj === 'object' && obj instanceof Symbol;
}
if (typeof obj === 'symbol') {
return true;
}
if (!obj || typeof obj !== 'object' || !symToString) {
return false;
}
try {
symToString.call(obj);
return true;
} catch (e) {}
return false;
}
function isBigInt(obj) {
if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
return false;
}
try {
bigIntValueOf.call(obj);
return true;
} catch (e) {}
return false;
}
var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
return hasOwn.call(obj, key);
}
function toStr(obj) {
return objectToString.call(obj);
}
function nameOf(f) {
if (f.name) { return f.name; }
var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
if (m) { return m[1]; }
return null;
}
function indexOf(xs, x) {
if (xs.indexOf) { return xs.indexOf(x); }
for (var i = 0, l = xs.length; i < l; i++) {
if (xs[i] === x) { return i; }
}
return -1;
}
function isMap(x) {
if (!mapSize || !x || typeof x !== 'object') {
return false;
}
try {
mapSize.call(x);
try {
setSize.call(x);
} catch (s) {
return true;
}
return x instanceof Map; // core-js workaround, pre-v2.5.0
} catch (e) {}
return false;
}
function isWeakMap(x) {
if (!weakMapHas || !x || typeof x !== 'object') {
return false;
}
try {
weakMapHas.call(x, weakMapHas);
try {
weakSetHas.call(x, weakSetHas);
} catch (s) {
return true;
}
return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
} catch (e) {}
return false;
}
function isWeakRef(x) {
if (!weakRefDeref || !x || typeof x !== 'object') {
return false;
}
try {
weakRefDeref.call(x);
return true;
} catch (e) {}
return false;
}
function isSet(x) {
if (!setSize || !x || typeof x !== 'object') {
return false;
}
try {
setSize.call(x);
try {
mapSize.call(x);
} catch (m) {
return true;
}
return x instanceof Set; // core-js workaround, pre-v2.5.0
} catch (e) {}
return false;
}
function isWeakSet(x) {
if (!weakSetHas || !x || typeof x !== 'object') {
return false;
}
try {
weakSetHas.call(x, weakSetHas);
try {
weakMapHas.call(x, weakMapHas);
} catch (s) {
return true;
}
return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
} catch (e) {}
return false;
}
function isElement(x) {
if (!x || typeof x !== 'object') { return false; }
if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
return true;
}
return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}
function inspectString(str, opts) {
if (str.length > opts.maxStringLength) {
var remaining = str.length - opts.maxStringLength;
var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
}
var quoteRE = quoteREs[opts.quoteStyle || 'single'];
quoteRE.lastIndex = 0;
// eslint-disable-next-line no-control-regex
var s = $replace.call($replace.call(str, quoteRE, '\\$1'), /[\x00-\x1f]/g, lowbyte);
return wrapQuotes(s, 'single', opts);
}
function lowbyte(c) {
var n = c.charCodeAt(0);
var x = {
8: 'b',
9: 't',
10: 'n',
12: 'f',
13: 'r'
}[n];
if (x) { return '\\' + x; }
return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}
function markBoxed(str) {
return 'Object(' + str + ')';
}
function weakCollectionOf(type) {
return type + ' { ? }';
}
function collectionOf(type, size, entries, indent) {
var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
return type + ' (' + size + ') {' + joinedEntries + '}';
}
function singleLineValues(xs) {
for (var i = 0; i < xs.length; i++) {
if (indexOf(xs[i], '\n') >= 0) {
return false;
}
}
return true;
}
function getIndent(opts, depth) {
var baseIndent;
if (opts.indent === '\t') {
baseIndent = '\t';
} else if (typeof opts.indent === 'number' && opts.indent > 0) {
baseIndent = $join.call(Array(opts.indent + 1), ' ');
} else {
return null;
}
return {
base: baseIndent,
prev: $join.call(Array(depth + 1), baseIndent)
};
}
function indentedJoin(xs, indent) {
if (xs.length === 0) { return ''; }
var lineJoiner = '\n' + indent.prev + indent.base;
return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}
function arrObjKeys(obj, inspect) {
var isArr = isArray(obj);
var xs = [];
if (isArr) {
xs.length = obj.length;
for (var i = 0; i < obj.length; i++) {
xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
}
}
var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
var symMap;
if (hasShammedSymbols) {
symMap = {};
for (var k = 0; k < syms.length; k++) {
symMap['$' + syms[k]] = syms[k];
}
}
for (var key in obj) { // eslint-disable-line no-restricted-syntax
if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
// this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
continue; // eslint-disable-line no-restricted-syntax, no-continue
} else if ($test.call(/[^\w$]/, key)) {
xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
} else {
xs.push(key + ': ' + inspect(obj[key], obj));
}
}
if (typeof gOPS === 'function') {
for (var j = 0; j < syms.length; j++) {
if (isEnumerable.call(obj, syms[j])) {
xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
}
}
}
return xs;
}
/***/ }),
/***/ "../../../node_modules/prop-types/checkPropTypes.js":
/*!**********************************************************!*\
!*** ../../../node_modules/prop-types/checkPropTypes.js ***!
\**********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var printWarning = function() {};
if (true) {
var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "../../../node_modules/prop-types/lib/ReactPropTypesSecret.js");
var loggedTypeFailures = {};
var has = __webpack_require__(/*! ./lib/has */ "../../../node_modules/prop-types/lib/has.js");
printWarning = function(text) {
var message = 'Warning: ' + text;
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) { /**/ }
};
}
/**
* Assert that the values match with the type specs.
* Error messages are memorized and will only be shown once.
*
* @param {object} typeSpecs Map of name to a ReactPropType
* @param {object} values Runtime values that need to be type-checked
* @param {string} location e.g. "prop", "context", "child context"
* @param {string} componentName Name of the component for error messages.
* @param {?Function} getStack Returns the component stack.
* @private
*/
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
if (true) {
for (var typeSpecName in typeSpecs) {
if (has(typeSpecs, typeSpecName)) {
var error;
// Prop type validation may throw. In case they do, we don't want to
// fail the render phase where it didn't fail before. So we log it.
// After these have been cleaned up, we'll let them throw.
try {
// This is intentionally an invariant that gets caught. It's the same
// behavior as without this statement except with a better message.
if (typeof typeSpecs[typeSpecName] !== 'function') {
var err = Error(
(componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +
'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'
);
err.name = 'Invariant Violation';
throw err;
}
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
} catch (ex) {
error = ex;
}
if (error && !(error instanceof Error)) {
printWarning(
(componentName || 'React class') + ': type specification of ' +
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
'You may have forgotten to pass an argument to the type checker ' +
'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
'shape all require an argument).'
);
}
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
// Only monitor this failure once because there tends to be a lot of the
// same error.
loggedTypeFailures[error.message] = true;
var stack = getStack ? getStack() : '';
printWarning(
'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
);
}
}
}
}
}
/**
* Resets warning cache when testing.
*
* @private
*/
checkPropTypes.resetWarningCache = function() {
if (true) {
loggedTypeFailures = {};
}
}
module.exports = checkPropTypes;
/***/ }),
/***/ "../../../node_modules/prop-types/factoryWithTypeCheckers.js":
/*!*******************************************************************!*\
!*** ../../../node_modules/prop-types/factoryWithTypeCheckers.js ***!
\*******************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var ReactIs = __webpack_require__(/*! react-is */ "../../../node_modules/prop-types/node_modules/react-is/index.js");
var assign = __webpack_require__(/*! object-assign */ "../../../node_modules/object-assign/index.js");
var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "../../../node_modules/prop-types/lib/ReactPropTypesSecret.js");
var has = __webpack_require__(/*! ./lib/has */ "../../../node_modules/prop-types/lib/has.js");
var checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ "../../../node_modules/prop-types/checkPropTypes.js");
var printWarning = function() {};
if (true) {
printWarning = function(text) {
var message = 'Warning: ' + text;
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) {}
};
}
function emptyFunctionThatReturnsNull() {
return null;
}
module.exports = function(isValidElement, throwOnDirectAccess) {
/* global Symbol */
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
/**
* Returns the iterator method function contained on the iterable object.
*
* Be sure to invoke the function with the iterable as context:
*
* var iteratorFn = getIteratorFn(myIterable);
* if (iteratorFn) {
* var iterator = iteratorFn.call(myIterable);
* ...
* }
*
* @param {?object} maybeIterable
* @return {?function}
*/
function getIteratorFn(maybeIterable) {
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
if (typeof iteratorFn === 'function') {
return iteratorFn;
}
}
/**
* Collection of methods that allow declaration and validation of props that are
* supplied to React components. Example usage:
*
* var Props = require('ReactPropTypes');
* var MyArticle = React.createClass({
* propTypes: {
* // An optional string prop named "description".
* description: Props.string,
*
* // A required enum prop named "category".
* category: Props.oneOf(['News','Photos']).isRequired,
*
* // A prop named "dialog" that requires an instance of Dialog.
* dialog: Props.instanceOf(Dialog).isRequired
* },
* render: function() { ... }
* });
*
* A more formal specification of how these methods are used:
*
* type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
* decl := ReactPropTypes.{type}(.isRequired)?
*
* Each and every declaration produces a function with the same signature. This
* allows the creation of custom validation functions. For example:
*
* var MyLink = React.createClass({
* propTypes: {
* // An optional string or URI prop named "href".
* href: function(props, propName, componentName) {
* var propValue = props[propName];
* if (propValue != null && typeof propValue !== 'string' &&
* !(propValue instanceof URI)) {
* return new Error(
* 'Expected a string or an URI for ' + propName + ' in ' +
* componentName
* );
* }
* }
* },
* render: function() {...}
* });
*
* @internal
*/
var ANONYMOUS = '<>';
// Important!
// Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
var ReactPropTypes = {
array: createPrimitiveTypeChecker('array'),
bigint: createPrimitiveTypeChecker('bigint'),
bool: createPrimitiveTypeChecker('boolean'),
func: createPrimitiveTypeChecker('function'),
number: createPrimitiveTypeChecker('number'),
object: createPrimitiveTypeChecker('object'),
string: createPrimitiveTypeChecker('string'),
symbol: createPrimitiveTypeChecker('symbol'),
any: createAnyTypeChecker(),
arrayOf: createArrayOfTypeChecker,
element: createElementTypeChecker(),
elementType: createElementTypeTypeChecker(),
instanceOf: createInstanceTypeChecker,
node: createNodeChecker(),
objectOf: createObjectOfTypeChecker,
oneOf: createEnumTypeChecker,
oneOfType: createUnionTypeChecker,
shape: createShapeTypeChecker,
exact: createStrictShapeTypeChecker,
};
/**
* inlined Object.is polyfill to avoid requiring consumers ship their own
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
*/
/*eslint-disable no-self-compare*/
function is(x, y) {
// SameValue algorithm
if (x === y) {
// Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
}
/*eslint-enable no-self-compare*/
/**
* We use an Error-like object for backward compatibility as people may call
* PropTypes directly and inspect their output. However, we don't use real
* Errors anymore. We don't inspect their stack anyway, and creating them
* is prohibitively expensive if they are created too often, such as what
* happens in oneOfType() for any type before the one that matched.
*/
function PropTypeError(message, data) {
this.message = message;
this.data = data && typeof data === 'object' ? data: {};
this.stack = '';
}
// Make `instanceof Error` still work for returned errors.
PropTypeError.prototype = Error.prototype;
function createChainableTypeChecker(validate) {
if (true) {
var manualPropTypeCallCache = {};
var manualPropTypeWarningCount = 0;
}
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
componentName = componentName || ANONYMOUS;
propFullName = propFullName || propName;
if (secret !== ReactPropTypesSecret) {
if (throwOnDirectAccess) {
// New behavior only for users of `prop-types` package
var err = new Error(
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
'Use `PropTypes.checkPropTypes()` to call them. ' +
'Read more at http://fb.me/use-check-prop-types'
);
err.name = 'Invariant Violation';
throw err;
} else if ( true && typeof console !== 'undefined') {
// Old behavior for people using React.PropTypes
var cacheKey = componentName + ':' + propName;
if (
!manualPropTypeCallCache[cacheKey] &&
// Avoid spamming the console because they are often not actionable except for lib authors
manualPropTypeWarningCount < 3
) {
printWarning(
'You are manually calling a React.PropTypes validation ' +
'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +
'and will throw in the standalone `prop-types` package. ' +
'You may be seeing this warning due to a third-party PropTypes ' +
'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
);
manualPropTypeCallCache[cacheKey] = true;
manualPropTypeWarningCount++;
}
}
}
if (props[propName] == null) {
if (isRequired) {
if (props[propName] === null) {
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
}
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
}
return null;
} else {
return validate(props, propName, componentName, location, propFullName);
}
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createPrimitiveTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName, secret) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== expectedType) {
// `propValue` being instance of, say, date/regexp, pass the 'object'
// check, but we can offer a more precise error message here rather than
// 'of type `object`'.
var preciseType = getPreciseType(propValue);
return new PropTypeError(
'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),
{expectedType: expectedType}
);
}
return null;
}
return createChainableTypeChecker(validate);
}
function createAnyTypeChecker() {
return createChainableTypeChecker(emptyFunctionThatReturnsNull);
}
function createArrayOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
if (typeof typeChecker !== 'function') {
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
}
var propValue = props[propName];
if (!Array.isArray(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
}
for (var i = 0; i < propValue.length; i++) {
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
if (error instanceof Error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!isValidElement(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!ReactIs.isValidElementType(propValue)) {
var propType = getPropType(propValue);
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createInstanceTypeChecker(expectedClass) {
function validate(props, propName, componentName, location, propFullName) {
if (!(props[propName] instanceof expectedClass)) {
var expectedClassName = expectedClass.name || ANONYMOUS;
var actualClassName = getClassName(props[propName]);
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createEnumTypeChecker(expectedValues) {
if (!Array.isArray(expectedValues)) {
if (true) {
if (arguments.length > 1) {
printWarning(
'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
);
} else {
printWarning('Invalid argument supplied to oneOf, expected an array.');
}
}
return emptyFunctionThatReturnsNull;
}
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
for (var i = 0; i < expectedValues.length; i++) {
if (is(propValue, expectedValues[i])) {
return null;
}
}
var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
var type = getPreciseType(value);
if (type === 'symbol') {
return String(value);
}
return value;
});
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
}
return createChainableTypeChecker(validate);
}
function createObjectOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
if (typeof typeChecker !== 'function') {
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
}
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
}
for (var key in propValue) {
if (has(propValue, key)) {
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
if (error instanceof Error) {
return error;
}
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createUnionTypeChecker(arrayOfTypeCheckers) {
if (!Array.isArray(arrayOfTypeCheckers)) {
true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : 0;
return emptyFunctionThatReturnsNull;
}
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
var checker = arrayOfTypeCheckers[i];
if (typeof checker !== 'function') {
printWarning(
'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
);
return emptyFunctionThatReturnsNull;
}
}
function validate(props, propName, componentName, location, propFullName) {
var expectedTypes = [];
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
var checker = arrayOfTypeCheckers[i];
var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);
if (checkerResult == null) {
return null;
}
if (checkerResult.data && has(checkerResult.data, 'expectedType')) {
expectedTypes.push(checkerResult.data.expectedType);
}
}
var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));
}
return createChainableTypeChecker(validate);
}
function createNodeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!isNode(props[propName])) {
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function invalidValidatorError(componentName, location, propFullName, key, type) {
return new PropTypeError(
(componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +
'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'
);
}
function createShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
}
for (var key in shapeTypes) {
var checker = shapeTypes[key];
if (typeof checker !== 'function') {
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
}
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createStrictShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
}
// We need to check all keys in case some are required but missing from props.
var allKeys = assign({}, props[propName], shapeTypes);
for (var key in allKeys) {
var checker = shapeTypes[key];
if (has(shapeTypes, key) && typeof checker !== 'function') {
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
}
if (!checker) {
return new PropTypeError(
'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
'\nBad object: ' + JSON.stringify(props[propName], null, ' ') +
'\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')
);
}
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function isNode(propValue) {
switch (typeof propValue) {
case 'number':
case 'string':
case 'undefined':
return true;
case 'boolean':
return !propValue;
case 'object':
if (Array.isArray(propValue)) {
return propValue.every(isNode);
}
if (propValue === null || isValidElement(propValue)) {
return true;
}
var iteratorFn = getIteratorFn(propValue);
if (iteratorFn) {
var iterator = iteratorFn.call(propValue);
var step;
if (iteratorFn !== propValue.entries) {
while (!(step = iterator.next()).done) {
if (!isNode(step.value)) {
return false;
}
}
} else {
// Iterator will provide entry [k,v] tuples rather than values.
while (!(step = iterator.next()).done) {
var entry = step.value;
if (entry) {
if (!isNode(entry[1])) {
return false;
}
}
}
}
} else {
return false;
}
return true;
default:
return false;
}
}
function isSymbol(propType, propValue) {
// Native Symbol.
if (propType === 'symbol') {
return true;
}
// falsy value can't be a Symbol
if (!propValue) {
return false;
}
// 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
if (propValue['@@toStringTag'] === 'Symbol') {
return true;
}
// Fallback for non-spec compliant Symbols which are polyfilled.
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
return true;
}
return false;
}
// Equivalent of `typeof` but with special handling for array and regexp.
function getPropType(propValue) {
var propType = typeof propValue;
if (Array.isArray(propValue)) {
return 'array';
}
if (propValue instanceof RegExp) {
// Old webkits (at least until Android 4.0) return 'function' rather than
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
// passes PropTypes.object.
return 'object';
}
if (isSymbol(propType, propValue)) {
return 'symbol';
}
return propType;
}
// This handles more types than `getPropType`. Only used for error messages.
// See `createPrimitiveTypeChecker`.
function getPreciseType(propValue) {
if (typeof propValue === 'undefined' || propValue === null) {
return '' + propValue;
}
var propType = getPropType(propValue);
if (propType === 'object') {
if (propValue instanceof Date) {
return 'date';
} else if (propValue instanceof RegExp) {
return 'regexp';
}
}
return propType;
}
// Returns a string that is postfixed to a warning about an invalid type.
// For example, "undefined" or "of type array"
function getPostfixForTypeWarning(value) {
var type = getPreciseType(value);
switch (type) {
case 'array':
case 'object':
return 'an ' + type;
case 'boolean':
case 'date':
case 'regexp':
return 'a ' + type;
default:
return type;
}
}
// Returns class name of the object, if any.
function getClassName(propValue) {
if (!propValue.constructor || !propValue.constructor.name) {
return ANONYMOUS;
}
return propValue.constructor.name;
}
ReactPropTypes.checkPropTypes = checkPropTypes;
ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
ReactPropTypes.PropTypes = ReactPropTypes;
return ReactPropTypes;
};
/***/ }),
/***/ "../../../node_modules/prop-types/index.js":
/*!*************************************************!*\
!*** ../../../node_modules/prop-types/index.js ***!
\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
if (true) {
var ReactIs = __webpack_require__(/*! react-is */ "../../../node_modules/prop-types/node_modules/react-is/index.js");
// By explicitly using `prop-types` you are opting into new development behavior.
// http://fb.me/prop-types-in-prod
var throwOnDirectAccess = true;
module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ "../../../node_modules/prop-types/factoryWithTypeCheckers.js")(ReactIs.isElement, throwOnDirectAccess);
} else // removed by dead control flow
{}
/***/ }),
/***/ "../../../node_modules/prop-types/lib/ReactPropTypesSecret.js":
/*!********************************************************************!*\
!*** ../../../node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
\********************************************************************/
/***/ ((module) => {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
module.exports = ReactPropTypesSecret;
/***/ }),
/***/ "../../../node_modules/prop-types/lib/has.js":
/*!***************************************************!*\
!*** ../../../node_modules/prop-types/lib/has.js ***!
\***************************************************/
/***/ ((module) => {
module.exports = Function.call.bind(Object.prototype.hasOwnProperty);
/***/ }),
/***/ "../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js":
/*!******************************************************************************************!*\
!*** ../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js ***!
\******************************************************************************************/
/***/ ((__unused_webpack_module, exports) => {
"use strict";
/** @license React v16.13.1
* react-is.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
if (true) {
(function() {
'use strict';
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
// nor polyfill, then a plain number is used for performance.
var hasSymbol = typeof Symbol === 'function' && Symbol.for;
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
// (unstable) APIs that have been removed. Can we remove the symbols?
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
function isValidElementType(type) {
return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
}
function typeOf(object) {
if (typeof object === 'object' && object !== null) {
var $$typeof = object.$$typeof;
switch ($$typeof) {
case REACT_ELEMENT_TYPE:
var type = object.type;
switch (type) {
case REACT_ASYNC_MODE_TYPE:
case REACT_CONCURRENT_MODE_TYPE:
case REACT_FRAGMENT_TYPE:
case REACT_PROFILER_TYPE:
case REACT_STRICT_MODE_TYPE:
case REACT_SUSPENSE_TYPE:
return type;
default:
var $$typeofType = type && type.$$typeof;
switch ($$typeofType) {
case REACT_CONTEXT_TYPE:
case REACT_FORWARD_REF_TYPE:
case REACT_LAZY_TYPE:
case REACT_MEMO_TYPE:
case REACT_PROVIDER_TYPE:
return $$typeofType;
default:
return $$typeof;
}
}
case REACT_PORTAL_TYPE:
return $$typeof;
}
}
return undefined;
} // AsyncMode is deprecated along with isAsyncMode
var AsyncMode = REACT_ASYNC_MODE_TYPE;
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
var ContextConsumer = REACT_CONTEXT_TYPE;
var ContextProvider = REACT_PROVIDER_TYPE;
var Element = REACT_ELEMENT_TYPE;
var ForwardRef = REACT_FORWARD_REF_TYPE;
var Fragment = REACT_FRAGMENT_TYPE;
var Lazy = REACT_LAZY_TYPE;
var Memo = REACT_MEMO_TYPE;
var Portal = REACT_PORTAL_TYPE;
var Profiler = REACT_PROFILER_TYPE;
var StrictMode = REACT_STRICT_MODE_TYPE;
var Suspense = REACT_SUSPENSE_TYPE;
var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated
function isAsyncMode(object) {
{
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
}
}
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
}
function isConcurrentMode(object) {
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
}
function isContextConsumer(object) {
return typeOf(object) === REACT_CONTEXT_TYPE;
}
function isContextProvider(object) {
return typeOf(object) === REACT_PROVIDER_TYPE;
}
function isElement(object) {
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
}
function isForwardRef(object) {
return typeOf(object) === REACT_FORWARD_REF_TYPE;
}
function isFragment(object) {
return typeOf(object) === REACT_FRAGMENT_TYPE;
}
function isLazy(object) {
return typeOf(object) === REACT_LAZY_TYPE;
}
function isMemo(object) {
return typeOf(object) === REACT_MEMO_TYPE;
}
function isPortal(object) {
return typeOf(object) === REACT_PORTAL_TYPE;
}
function isProfiler(object) {
return typeOf(object) === REACT_PROFILER_TYPE;
}
function isStrictMode(object) {
return typeOf(object) === REACT_STRICT_MODE_TYPE;
}
function isSuspense(object) {
return typeOf(object) === REACT_SUSPENSE_TYPE;
}
exports.AsyncMode = AsyncMode;
exports.ConcurrentMode = ConcurrentMode;
exports.ContextConsumer = ContextConsumer;
exports.ContextProvider = ContextProvider;
exports.Element = Element;
exports.ForwardRef = ForwardRef;
exports.Fragment = Fragment;
exports.Lazy = Lazy;
exports.Memo = Memo;
exports.Portal = Portal;
exports.Profiler = Profiler;
exports.StrictMode = StrictMode;
exports.Suspense = Suspense;
exports.isAsyncMode = isAsyncMode;
exports.isConcurrentMode = isConcurrentMode;
exports.isContextConsumer = isContextConsumer;
exports.isContextProvider = isContextProvider;
exports.isElement = isElement;
exports.isForwardRef = isForwardRef;
exports.isFragment = isFragment;
exports.isLazy = isLazy;
exports.isMemo = isMemo;
exports.isPortal = isPortal;
exports.isProfiler = isProfiler;
exports.isStrictMode = isStrictMode;
exports.isSuspense = isSuspense;
exports.isValidElementType = isValidElementType;
exports.typeOf = typeOf;
})();
}
/***/ }),
/***/ "../../../node_modules/prop-types/node_modules/react-is/index.js":
/*!***********************************************************************!*\
!*** ../../../node_modules/prop-types/node_modules/react-is/index.js ***!
\***********************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
if (false) // removed by dead control flow
{} else {
module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "../../../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js");
}
/***/ }),
/***/ "../../../node_modules/qrcode.react/lib/esm/index.js":
/*!***********************************************************!*\
!*** ../../../node_modules/qrcode.react/lib/esm/index.js ***!
\***********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ QRCodeCanvas: () => (/* binding */ QRCodeCanvas),
/* harmony export */ QRCodeSVG: () => (/* binding */ QRCodeSVG)
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js");
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __objRest = (source, exclude) => {
var target = {};
for (var prop in source)
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
target[prop] = source[prop];
if (source != null && __getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(source)) {
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
target[prop] = source[prop];
}
return target;
};
// src/index.tsx
// src/third-party/qrcodegen/index.ts
/**
* @license QR Code generator library (TypeScript)
* Copyright (c) Project Nayuki.
* SPDX-License-Identifier: MIT
*/
var qrcodegen;
((qrcodegen2) => {
const _QrCode = class _QrCode {
/*-- Constructor (low level) and fields --*/
// Creates a new QR Code with the given version number,
// error correction level, data codeword bytes, and mask number.
// This is a low-level API that most users should not use directly.
// A mid-level API is the encodeSegments() function.
constructor(version, errorCorrectionLevel, dataCodewords, msk) {
this.version = version;
this.errorCorrectionLevel = errorCorrectionLevel;
// The modules of this QR Code (false = light, true = dark).
// Immutable after constructor finishes. Accessed through getModule().
this.modules = [];
// Indicates function modules that are not subjected to masking. Discarded when constructor finishes.
this.isFunction = [];
if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)
throw new RangeError("Version value out of range");
if (msk < -1 || msk > 7)
throw new RangeError("Mask value out of range");
this.size = version * 4 + 17;
let row = [];
for (let i = 0; i < this.size; i++)
row.push(false);
for (let i = 0; i < this.size; i++) {
this.modules.push(row.slice());
this.isFunction.push(row.slice());
}
this.drawFunctionPatterns();
const allCodewords = this.addEccAndInterleave(dataCodewords);
this.drawCodewords(allCodewords);
if (msk == -1) {
let minPenalty = 1e9;
for (let i = 0; i < 8; i++) {
this.applyMask(i);
this.drawFormatBits(i);
const penalty = this.getPenaltyScore();
if (penalty < minPenalty) {
msk = i;
minPenalty = penalty;
}
this.applyMask(i);
}
}
assert(0 <= msk && msk <= 7);
this.mask = msk;
this.applyMask(msk);
this.drawFormatBits(msk);
this.isFunction = [];
}
/*-- Static factory functions (high level) --*/
// Returns a QR Code representing the given Unicode text string at the given error correction level.
// As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer
// Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible
// QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the
// ecl argument if it can be done without increasing the version.
static encodeText(text, ecl) {
const segs = qrcodegen2.QrSegment.makeSegments(text);
return _QrCode.encodeSegments(segs, ecl);
}
// Returns a QR Code representing the given binary data at the given error correction level.
// This function always encodes using the binary segment mode, not any text mode. The maximum number of
// bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.
// The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.
static encodeBinary(data, ecl) {
const seg = qrcodegen2.QrSegment.makeBytes(data);
return _QrCode.encodeSegments([seg], ecl);
}
/*-- Static factory functions (mid level) --*/
// Returns a QR Code representing the given segments with the given encoding parameters.
// The smallest possible QR Code version within the given range is automatically
// chosen for the output. Iff boostEcl is true, then the ECC level of the result
// may be higher than the ecl argument if it can be done without increasing the
// version. The mask number is either between 0 to 7 (inclusive) to force that
// mask, or -1 to automatically choose an appropriate mask (which may be slow).
// This function allows the user to create a custom sequence of segments that switches
// between modes (such as alphanumeric and byte) to encode text in less space.
// This is a mid-level API; the high-level API is encodeText() and encodeBinary().
static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {
if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)
throw new RangeError("Invalid value");
let version;
let dataUsedBits;
for (version = minVersion; ; version++) {
const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;
const usedBits = QrSegment.getTotalBits(segs, version);
if (usedBits <= dataCapacityBits2) {
dataUsedBits = usedBits;
break;
}
if (version >= maxVersion)
throw new RangeError("Data too long");
}
for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {
if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)
ecl = newEcl;
}
let bb = [];
for (const seg of segs) {
appendBits(seg.mode.modeBits, 4, bb);
appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);
for (const b of seg.getData())
bb.push(b);
}
assert(bb.length == dataUsedBits);
const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;
assert(bb.length <= dataCapacityBits);
appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);
appendBits(0, (8 - bb.length % 8) % 8, bb);
assert(bb.length % 8 == 0);
for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)
appendBits(padByte, 8, bb);
let dataCodewords = [];
while (dataCodewords.length * 8 < bb.length)
dataCodewords.push(0);
bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));
return new _QrCode(version, ecl, dataCodewords, mask);
}
/*-- Accessor methods --*/
// Returns the color of the module (pixel) at the given coordinates, which is false
// for light or true for dark. The top left corner has the coordinates (x=0, y=0).
// If the given coordinates are out of bounds, then false (light) is returned.
getModule(x, y) {
return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];
}
// Modified to expose modules for easy access
getModules() {
return this.modules;
}
/*-- Private helper methods for constructor: Drawing function modules --*/
// Reads this object's version field, and draws and marks all function modules.
drawFunctionPatterns() {
for (let i = 0; i < this.size; i++) {
this.setFunctionModule(6, i, i % 2 == 0);
this.setFunctionModule(i, 6, i % 2 == 0);
}
this.drawFinderPattern(3, 3);
this.drawFinderPattern(this.size - 4, 3);
this.drawFinderPattern(3, this.size - 4);
const alignPatPos = this.getAlignmentPatternPositions();
const numAlign = alignPatPos.length;
for (let i = 0; i < numAlign; i++) {
for (let j = 0; j < numAlign; j++) {
if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))
this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);
}
}
this.drawFormatBits(0);
this.drawVersion();
}
// Draws two copies of the format bits (with its own error correction code)
// based on the given mask and this object's error correction level field.
drawFormatBits(mask) {
const data = this.errorCorrectionLevel.formatBits << 3 | mask;
let rem = data;
for (let i = 0; i < 10; i++)
rem = rem << 1 ^ (rem >>> 9) * 1335;
const bits = (data << 10 | rem) ^ 21522;
assert(bits >>> 15 == 0);
for (let i = 0; i <= 5; i++)
this.setFunctionModule(8, i, getBit(bits, i));
this.setFunctionModule(8, 7, getBit(bits, 6));
this.setFunctionModule(8, 8, getBit(bits, 7));
this.setFunctionModule(7, 8, getBit(bits, 8));
for (let i = 9; i < 15; i++)
this.setFunctionModule(14 - i, 8, getBit(bits, i));
for (let i = 0; i < 8; i++)
this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));
for (let i = 8; i < 15; i++)
this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));
this.setFunctionModule(8, this.size - 8, true);
}
// Draws two copies of the version bits (with its own error correction code),
// based on this object's version field, iff 7 <= version <= 40.
drawVersion() {
if (this.version < 7)
return;
let rem = this.version;
for (let i = 0; i < 12; i++)
rem = rem << 1 ^ (rem >>> 11) * 7973;
const bits = this.version << 12 | rem;
assert(bits >>> 18 == 0);
for (let i = 0; i < 18; i++) {
const color = getBit(bits, i);
const a = this.size - 11 + i % 3;
const b = Math.floor(i / 3);
this.setFunctionModule(a, b, color);
this.setFunctionModule(b, a, color);
}
}
// Draws a 9*9 finder pattern including the border separator,
// with the center module at (x, y). Modules can be out of bounds.
drawFinderPattern(x, y) {
for (let dy = -4; dy <= 4; dy++) {
for (let dx = -4; dx <= 4; dx++) {
const dist = Math.max(Math.abs(dx), Math.abs(dy));
const xx = x + dx;
const yy = y + dy;
if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)
this.setFunctionModule(xx, yy, dist != 2 && dist != 4);
}
}
}
// Draws a 5*5 alignment pattern, with the center module
// at (x, y). All modules must be in bounds.
drawAlignmentPattern(x, y) {
for (let dy = -2; dy <= 2; dy++) {
for (let dx = -2; dx <= 2; dx++)
this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);
}
}
// Sets the color of a module and marks it as a function module.
// Only used by the constructor. Coordinates must be in bounds.
setFunctionModule(x, y, isDark) {
this.modules[y][x] = isDark;
this.isFunction[y][x] = true;
}
/*-- Private helper methods for constructor: Codewords and masking --*/
// Returns a new byte string representing the given data with the appropriate error correction
// codewords appended to it, based on this object's version and error correction level.
addEccAndInterleave(data) {
const ver = this.version;
const ecl = this.errorCorrectionLevel;
if (data.length != _QrCode.getNumDataCodewords(ver, ecl))
throw new RangeError("Invalid argument");
const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];
const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];
const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);
const numShortBlocks = numBlocks - rawCodewords % numBlocks;
const shortBlockLen = Math.floor(rawCodewords / numBlocks);
let blocks = [];
const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);
for (let i = 0, k = 0; i < numBlocks; i++) {
let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));
k += dat.length;
const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);
if (i < numShortBlocks)
dat.push(0);
blocks.push(dat.concat(ecc));
}
let result = [];
for (let i = 0; i < blocks[0].length; i++) {
blocks.forEach((block, j) => {
if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)
result.push(block[i]);
});
}
assert(result.length == rawCodewords);
return result;
}
// Draws the given sequence of 8-bit codewords (data and error correction) onto the entire
// data area of this QR Code. Function modules need to be marked off before this is called.
drawCodewords(data) {
if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))
throw new RangeError("Invalid argument");
let i = 0;
for (let right = this.size - 1; right >= 1; right -= 2) {
if (right == 6)
right = 5;
for (let vert = 0; vert < this.size; vert++) {
for (let j = 0; j < 2; j++) {
const x = right - j;
const upward = (right + 1 & 2) == 0;
const y = upward ? this.size - 1 - vert : vert;
if (!this.isFunction[y][x] && i < data.length * 8) {
this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));
i++;
}
}
}
}
assert(i == data.length * 8);
}
// XORs the codeword modules in this QR Code with the given mask pattern.
// The function modules must be marked and the codeword bits must be drawn
// before masking. Due to the arithmetic of XOR, calling applyMask() with
// the same mask value a second time will undo the mask. A final well-formed
// QR Code needs exactly one (not zero, two, etc.) mask applied.
applyMask(mask) {
if (mask < 0 || mask > 7)
throw new RangeError("Mask value out of range");
for (let y = 0; y < this.size; y++) {
for (let x = 0; x < this.size; x++) {
let invert;
switch (mask) {
case 0:
invert = (x + y) % 2 == 0;
break;
case 1:
invert = y % 2 == 0;
break;
case 2:
invert = x % 3 == 0;
break;
case 3:
invert = (x + y) % 3 == 0;
break;
case 4:
invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;
break;
case 5:
invert = x * y % 2 + x * y % 3 == 0;
break;
case 6:
invert = (x * y % 2 + x * y % 3) % 2 == 0;
break;
case 7:
invert = ((x + y) % 2 + x * y % 3) % 2 == 0;
break;
default:
throw new Error("Unreachable");
}
if (!this.isFunction[y][x] && invert)
this.modules[y][x] = !this.modules[y][x];
}
}
}
// Calculates and returns the penalty score based on state of this QR Code's current modules.
// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.
getPenaltyScore() {
let result = 0;
for (let y = 0; y < this.size; y++) {
let runColor = false;
let runX = 0;
let runHistory = [0, 0, 0, 0, 0, 0, 0];
for (let x = 0; x < this.size; x++) {
if (this.modules[y][x] == runColor) {
runX++;
if (runX == 5)
result += _QrCode.PENALTY_N1;
else if (runX > 5)
result++;
} else {
this.finderPenaltyAddHistory(runX, runHistory);
if (!runColor)
result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;
runColor = this.modules[y][x];
runX = 1;
}
}
result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;
}
for (let x = 0; x < this.size; x++) {
let runColor = false;
let runY = 0;
let runHistory = [0, 0, 0, 0, 0, 0, 0];
for (let y = 0; y < this.size; y++) {
if (this.modules[y][x] == runColor) {
runY++;
if (runY == 5)
result += _QrCode.PENALTY_N1;
else if (runY > 5)
result++;
} else {
this.finderPenaltyAddHistory(runY, runHistory);
if (!runColor)
result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;
runColor = this.modules[y][x];
runY = 1;
}
}
result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;
}
for (let y = 0; y < this.size - 1; y++) {
for (let x = 0; x < this.size - 1; x++) {
const color = this.modules[y][x];
if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])
result += _QrCode.PENALTY_N2;
}
}
let dark = 0;
for (const row of this.modules)
dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);
const total = this.size * this.size;
const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;
assert(0 <= k && k <= 9);
result += k * _QrCode.PENALTY_N4;
assert(0 <= result && result <= 2568888);
return result;
}
/*-- Private helper functions --*/
// Returns an ascending list of positions of alignment patterns for this version number.
// Each position is in the range [0,177), and are used on both the x and y axes.
// This could be implemented as lookup table of 40 variable-length lists of integers.
getAlignmentPatternPositions() {
if (this.version == 1)
return [];
else {
const numAlign = Math.floor(this.version / 7) + 2;
const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;
let result = [6];
for (let pos = this.size - 7; result.length < numAlign; pos -= step)
result.splice(1, 0, pos);
return result;
}
}
// Returns the number of data bits that can be stored in a QR Code of the given version number, after
// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.
// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.
static getNumRawDataModules(ver) {
if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)
throw new RangeError("Version number out of range");
let result = (16 * ver + 128) * ver + 64;
if (ver >= 2) {
const numAlign = Math.floor(ver / 7) + 2;
result -= (25 * numAlign - 10) * numAlign - 55;
if (ver >= 7)
result -= 36;
}
assert(208 <= result && result <= 29648);
return result;
}
// Returns the number of 8-bit data (i.e. not error correction) codewords contained in any
// QR Code of the given version number and error correction level, with remainder bits discarded.
// This stateless pure function could be implemented as a (40*4)-cell lookup table.
static getNumDataCodewords(ver, ecl) {
return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];
}
// Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be
// implemented as a lookup table over all possible parameter values, instead of as an algorithm.
static reedSolomonComputeDivisor(degree) {
if (degree < 1 || degree > 255)
throw new RangeError("Degree out of range");
let result = [];
for (let i = 0; i < degree - 1; i++)
result.push(0);
result.push(1);
let root = 1;
for (let i = 0; i < degree; i++) {
for (let j = 0; j < result.length; j++) {
result[j] = _QrCode.reedSolomonMultiply(result[j], root);
if (j + 1 < result.length)
result[j] ^= result[j + 1];
}
root = _QrCode.reedSolomonMultiply(root, 2);
}
return result;
}
// Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.
static reedSolomonComputeRemainder(data, divisor) {
let result = divisor.map((_) => 0);
for (const b of data) {
const factor = b ^ result.shift();
result.push(0);
divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));
}
return result;
}
// Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result
// are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.
static reedSolomonMultiply(x, y) {
if (x >>> 8 != 0 || y >>> 8 != 0)
throw new RangeError("Byte out of range");
let z = 0;
for (let i = 7; i >= 0; i--) {
z = z << 1 ^ (z >>> 7) * 285;
z ^= (y >>> i & 1) * x;
}
assert(z >>> 8 == 0);
return z;
}
// Can only be called immediately after a light run is added, and
// returns either 0, 1, or 2. A helper function for getPenaltyScore().
finderPenaltyCountPatterns(runHistory) {
const n = runHistory[1];
assert(n <= this.size * 3);
const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;
return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);
}
// Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().
finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {
if (currentRunColor) {
this.finderPenaltyAddHistory(currentRunLength, runHistory);
currentRunLength = 0;
}
currentRunLength += this.size;
this.finderPenaltyAddHistory(currentRunLength, runHistory);
return this.finderPenaltyCountPatterns(runHistory);
}
// Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().
finderPenaltyAddHistory(currentRunLength, runHistory) {
if (runHistory[0] == 0)
currentRunLength += this.size;
runHistory.pop();
runHistory.unshift(currentRunLength);
}
};
/*-- Constants and tables --*/
// The minimum version number supported in the QR Code Model 2 standard.
_QrCode.MIN_VERSION = 1;
// The maximum version number supported in the QR Code Model 2 standard.
_QrCode.MAX_VERSION = 40;
// For use in getPenaltyScore(), when evaluating which mask is best.
_QrCode.PENALTY_N1 = 3;
_QrCode.PENALTY_N2 = 3;
_QrCode.PENALTY_N3 = 40;
_QrCode.PENALTY_N4 = 10;
_QrCode.ECC_CODEWORDS_PER_BLOCK = [
// Version: (note that index 0 is for padding, and is set to an illegal value)
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level
[-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
// Low
[-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],
// Medium
[-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
// Quartile
[-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
// High
];
_QrCode.NUM_ERROR_CORRECTION_BLOCKS = [
// Version: (note that index 0 is for padding, and is set to an illegal value)
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level
[-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],
// Low
[-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],
// Medium
[-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],
// Quartile
[-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]
// High
];
let QrCode = _QrCode;
qrcodegen2.QrCode = _QrCode;
function appendBits(val, len, bb) {
if (len < 0 || len > 31 || val >>> len != 0)
throw new RangeError("Value out of range");
for (let i = len - 1; i >= 0; i--)
bb.push(val >>> i & 1);
}
function getBit(x, i) {
return (x >>> i & 1) != 0;
}
function assert(cond) {
if (!cond)
throw new Error("Assertion error");
}
const _QrSegment = class _QrSegment {
/*-- Constructor (low level) and fields --*/
// Creates a new QR Code segment with the given attributes and data.
// The character count (numChars) must agree with the mode and the bit buffer length,
// but the constraint isn't checked. The given bit buffer is cloned and stored.
constructor(mode, numChars, bitData) {
this.mode = mode;
this.numChars = numChars;
this.bitData = bitData;
if (numChars < 0)
throw new RangeError("Invalid argument");
this.bitData = bitData.slice();
}
/*-- Static factory functions (mid level) --*/
// Returns a segment representing the given binary data encoded in
// byte mode. All input byte arrays are acceptable. Any text string
// can be converted to UTF-8 bytes and encoded as a byte mode segment.
static makeBytes(data) {
let bb = [];
for (const b of data)
appendBits(b, 8, bb);
return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);
}
// Returns a segment representing the given string of decimal digits encoded in numeric mode.
static makeNumeric(digits) {
if (!_QrSegment.isNumeric(digits))
throw new RangeError("String contains non-numeric characters");
let bb = [];
for (let i = 0; i < digits.length; ) {
const n = Math.min(digits.length - i, 3);
appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);
i += n;
}
return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);
}
// Returns a segment representing the given text string encoded in alphanumeric mode.
// The characters allowed are: 0 to 9, A to Z (uppercase only), space,
// dollar, percent, asterisk, plus, hyphen, period, slash, colon.
static makeAlphanumeric(text) {
if (!_QrSegment.isAlphanumeric(text))
throw new RangeError("String contains unencodable characters in alphanumeric mode");
let bb = [];
let i;
for (i = 0; i + 2 <= text.length; i += 2) {
let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;
temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));
appendBits(temp, 11, bb);
}
if (i < text.length)
appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);
return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);
}
// Returns a new mutable list of zero or more segments to represent the given Unicode text string.
// The result may use various segment modes and switch modes to optimize the length of the bit stream.
static makeSegments(text) {
if (text == "")
return [];
else if (_QrSegment.isNumeric(text))
return [_QrSegment.makeNumeric(text)];
else if (_QrSegment.isAlphanumeric(text))
return [_QrSegment.makeAlphanumeric(text)];
else
return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];
}
// Returns a segment representing an Extended Channel Interpretation
// (ECI) designator with the given assignment value.
static makeEci(assignVal) {
let bb = [];
if (assignVal < 0)
throw new RangeError("ECI assignment value out of range");
else if (assignVal < 1 << 7)
appendBits(assignVal, 8, bb);
else if (assignVal < 1 << 14) {
appendBits(2, 2, bb);
appendBits(assignVal, 14, bb);
} else if (assignVal < 1e6) {
appendBits(6, 3, bb);
appendBits(assignVal, 21, bb);
} else
throw new RangeError("ECI assignment value out of range");
return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);
}
// Tests whether the given string can be encoded as a segment in numeric mode.
// A string is encodable iff each character is in the range 0 to 9.
static isNumeric(text) {
return _QrSegment.NUMERIC_REGEX.test(text);
}
// Tests whether the given string can be encoded as a segment in alphanumeric mode.
// A string is encodable iff each character is in the following set: 0 to 9, A to Z
// (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.
static isAlphanumeric(text) {
return _QrSegment.ALPHANUMERIC_REGEX.test(text);
}
/*-- Methods --*/
// Returns a new copy of the data bits of this segment.
getData() {
return this.bitData.slice();
}
// (Package-private) Calculates and returns the number of bits needed to encode the given segments at
// the given version. The result is infinity if a segment has too many characters to fit its length field.
static getTotalBits(segs, version) {
let result = 0;
for (const seg of segs) {
const ccbits = seg.mode.numCharCountBits(version);
if (seg.numChars >= 1 << ccbits)
return Infinity;
result += 4 + ccbits + seg.bitData.length;
}
return result;
}
// Returns a new array of bytes representing the given string encoded in UTF-8.
static toUtf8ByteArray(str) {
str = encodeURI(str);
let result = [];
for (let i = 0; i < str.length; i++) {
if (str.charAt(i) != "%")
result.push(str.charCodeAt(i));
else {
result.push(parseInt(str.substring(i + 1, i + 3), 16));
i += 2;
}
}
return result;
}
};
/*-- Constants --*/
// Describes precisely all strings that are encodable in numeric mode.
_QrSegment.NUMERIC_REGEX = /^[0-9]*$/;
// Describes precisely all strings that are encodable in alphanumeric mode.
_QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\/:-]*$/;
// The set of all legal characters in alphanumeric mode,
// where each character value maps to the index in the string.
_QrSegment.ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
let QrSegment = _QrSegment;
qrcodegen2.QrSegment = _QrSegment;
})(qrcodegen || (qrcodegen = {}));
((qrcodegen2) => {
let QrCode;
((QrCode2) => {
const _Ecc = class _Ecc {
// The QR Code can tolerate about 30% erroneous codewords
/*-- Constructor and fields --*/
constructor(ordinal, formatBits) {
this.ordinal = ordinal;
this.formatBits = formatBits;
}
};
/*-- Constants --*/
_Ecc.LOW = new _Ecc(0, 1);
// The QR Code can tolerate about 7% erroneous codewords
_Ecc.MEDIUM = new _Ecc(1, 0);
// The QR Code can tolerate about 15% erroneous codewords
_Ecc.QUARTILE = new _Ecc(2, 3);
// The QR Code can tolerate about 25% erroneous codewords
_Ecc.HIGH = new _Ecc(3, 2);
let Ecc = _Ecc;
QrCode2.Ecc = _Ecc;
})(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));
})(qrcodegen || (qrcodegen = {}));
((qrcodegen2) => {
let QrSegment;
((QrSegment2) => {
const _Mode = class _Mode {
/*-- Constructor and fields --*/
constructor(modeBits, numBitsCharCount) {
this.modeBits = modeBits;
this.numBitsCharCount = numBitsCharCount;
}
/*-- Method --*/
// (Package-private) Returns the bit width of the character count field for a segment in
// this mode in a QR Code at the given version number. The result is in the range [0, 16].
numCharCountBits(ver) {
return this.numBitsCharCount[Math.floor((ver + 7) / 17)];
}
};
/*-- Constants --*/
_Mode.NUMERIC = new _Mode(1, [10, 12, 14]);
_Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);
_Mode.BYTE = new _Mode(4, [8, 16, 16]);
_Mode.KANJI = new _Mode(8, [8, 10, 12]);
_Mode.ECI = new _Mode(7, [0, 0, 0]);
let Mode = _Mode;
QrSegment2.Mode = _Mode;
})(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));
})(qrcodegen || (qrcodegen = {}));
var qrcodegen_default = qrcodegen;
// src/index.tsx
/**
* @license qrcode.react
* Copyright (c) Paul O'Shannessy
* SPDX-License-Identifier: ISC
*/
var ERROR_LEVEL_MAP = {
L: qrcodegen_default.QrCode.Ecc.LOW,
M: qrcodegen_default.QrCode.Ecc.MEDIUM,
Q: qrcodegen_default.QrCode.Ecc.QUARTILE,
H: qrcodegen_default.QrCode.Ecc.HIGH
};
var DEFAULT_SIZE = 128;
var DEFAULT_LEVEL = "L";
var DEFAULT_BGCOLOR = "#FFFFFF";
var DEFAULT_FGCOLOR = "#000000";
var DEFAULT_INCLUDEMARGIN = false;
var DEFAULT_MINVERSION = 1;
var SPEC_MARGIN_SIZE = 4;
var DEFAULT_MARGIN_SIZE = 0;
var DEFAULT_IMG_SCALE = 0.1;
function generatePath(modules, margin = 0) {
const ops = [];
modules.forEach(function(row, y) {
let start = null;
row.forEach(function(cell, x) {
if (!cell && start !== null) {
ops.push(
`M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`
);
start = null;
return;
}
if (x === row.length - 1) {
if (!cell) {
return;
}
if (start === null) {
ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);
} else {
ops.push(
`M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`
);
}
return;
}
if (cell && start === null) {
start = x;
}
});
});
return ops.join("");
}
function excavateModules(modules, excavation) {
return modules.slice().map((row, y) => {
if (y < excavation.y || y >= excavation.y + excavation.h) {
return row;
}
return row.map((cell, x) => {
if (x < excavation.x || x >= excavation.x + excavation.w) {
return cell;
}
return false;
});
});
}
function getImageSettings(cells, size, margin, imageSettings) {
if (imageSettings == null) {
return null;
}
const numCells = cells.length + margin * 2;
const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);
const scale = numCells / size;
const w = (imageSettings.width || defaultSize) * scale;
const h = (imageSettings.height || defaultSize) * scale;
const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;
const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;
const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;
let excavation = null;
if (imageSettings.excavate) {
let floorX = Math.floor(x);
let floorY = Math.floor(y);
let ceilW = Math.ceil(w + x - floorX);
let ceilH = Math.ceil(h + y - floorY);
excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };
}
const crossOrigin = imageSettings.crossOrigin;
return { x, y, h, w, excavation, opacity, crossOrigin };
}
function getMarginSize(includeMargin, marginSize) {
if (marginSize != null) {
return Math.max(Math.floor(marginSize), 0);
}
return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;
}
function useQRCode({
value,
level,
minVersion,
includeMargin,
marginSize,
imageSettings,
size,
boostLevel
}) {
let qrcode = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => {
const values = Array.isArray(value) ? value : [value];
const segments = values.reduce((accum, v) => {
accum.push(...qrcodegen_default.QrSegment.makeSegments(v));
return accum;
}, []);
return qrcodegen_default.QrCode.encodeSegments(
segments,
ERROR_LEVEL_MAP[level],
minVersion,
void 0,
void 0,
boostLevel
);
}, [value, level, minVersion, boostLevel]);
const { cells, margin, numCells, calculatedImageSettings } = react__WEBPACK_IMPORTED_MODULE_0__.useMemo(() => {
let cells2 = qrcode.getModules();
const margin2 = getMarginSize(includeMargin, marginSize);
const numCells2 = cells2.length + margin2 * 2;
const calculatedImageSettings2 = getImageSettings(
cells2,
size,
margin2,
imageSettings
);
return {
cells: cells2,
margin: margin2,
numCells: numCells2,
calculatedImageSettings: calculatedImageSettings2
};
}, [qrcode, size, imageSettings, includeMargin, marginSize]);
return {
qrcode,
margin,
cells,
numCells,
calculatedImageSettings
};
}
var SUPPORTS_PATH2D = function() {
try {
new Path2D().addPath(new Path2D());
} catch (e) {
return false;
}
return true;
}();
var QRCodeCanvas = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(
function QRCodeCanvas2(props, forwardedRef) {
const _a = props, {
value,
size = DEFAULT_SIZE,
level = DEFAULT_LEVEL,
bgColor = DEFAULT_BGCOLOR,
fgColor = DEFAULT_FGCOLOR,
includeMargin = DEFAULT_INCLUDEMARGIN,
minVersion = DEFAULT_MINVERSION,
boostLevel,
marginSize,
imageSettings
} = _a, extraProps = __objRest(_a, [
"value",
"size",
"level",
"bgColor",
"fgColor",
"includeMargin",
"minVersion",
"boostLevel",
"marginSize",
"imageSettings"
]);
const _b = extraProps, { style } = _b, otherProps = __objRest(_b, ["style"]);
const imgSrc = imageSettings == null ? void 0 : imageSettings.src;
const _canvas = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);
const _image = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);
const setCanvasRef = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(
(node) => {
_canvas.current = node;
if (typeof forwardedRef === "function") {
forwardedRef(node);
} else if (forwardedRef) {
forwardedRef.current = node;
}
},
[forwardedRef]
);
const [isImgLoaded, setIsImageLoaded] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);
const { margin, cells, numCells, calculatedImageSettings } = useQRCode({
value,
level,
minVersion,
boostLevel,
includeMargin,
marginSize,
imageSettings,
size
});
react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
if (_canvas.current != null) {
const canvas = _canvas.current;
const ctx = canvas.getContext("2d");
if (!ctx) {
return;
}
let cellsToDraw = cells;
const image = _image.current;
const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;
if (haveImageToRender) {
if (calculatedImageSettings.excavation != null) {
cellsToDraw = excavateModules(
cells,
calculatedImageSettings.excavation
);
}
}
const pixelRatio = window.devicePixelRatio || 1;
canvas.height = canvas.width = size * pixelRatio;
const scale = size / numCells * pixelRatio;
ctx.scale(scale, scale);
ctx.fillStyle = bgColor;
ctx.fillRect(0, 0, numCells, numCells);
ctx.fillStyle = fgColor;
if (SUPPORTS_PATH2D) {
ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));
} else {
cells.forEach(function(row, rdx) {
row.forEach(function(cell, cdx) {
if (cell) {
ctx.fillRect(cdx + margin, rdx + margin, 1, 1);
}
});
});
}
if (calculatedImageSettings) {
ctx.globalAlpha = calculatedImageSettings.opacity;
}
if (haveImageToRender) {
ctx.drawImage(
image,
calculatedImageSettings.x + margin,
calculatedImageSettings.y + margin,
calculatedImageSettings.w,
calculatedImageSettings.h
);
}
}
});
react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
setIsImageLoaded(false);
}, [imgSrc]);
const canvasStyle = __spreadValues({ height: size, width: size }, style);
let img = null;
if (imgSrc != null) {
img = /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
"img",
{
src: imgSrc,
key: imgSrc,
style: { display: "none" },
onLoad: () => {
setIsImageLoaded(true);
},
ref: _image,
crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin
}
);
}
return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
"canvas",
__spreadValues({
style: canvasStyle,
height: size,
width: size,
ref: setCanvasRef,
role: "img"
}, otherProps)
), img);
}
);
QRCodeCanvas.displayName = "QRCodeCanvas";
var QRCodeSVG = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(
function QRCodeSVG2(props, forwardedRef) {
const _a = props, {
value,
size = DEFAULT_SIZE,
level = DEFAULT_LEVEL,
bgColor = DEFAULT_BGCOLOR,
fgColor = DEFAULT_FGCOLOR,
includeMargin = DEFAULT_INCLUDEMARGIN,
minVersion = DEFAULT_MINVERSION,
boostLevel,
title,
marginSize,
imageSettings
} = _a, otherProps = __objRest(_a, [
"value",
"size",
"level",
"bgColor",
"fgColor",
"includeMargin",
"minVersion",
"boostLevel",
"title",
"marginSize",
"imageSettings"
]);
const { margin, cells, numCells, calculatedImageSettings } = useQRCode({
value,
level,
minVersion,
boostLevel,
includeMargin,
marginSize,
imageSettings,
size
});
let cellsToDraw = cells;
let image = null;
if (imageSettings != null && calculatedImageSettings != null) {
if (calculatedImageSettings.excavation != null) {
cellsToDraw = excavateModules(
cells,
calculatedImageSettings.excavation
);
}
image = /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
"image",
{
href: imageSettings.src,
height: calculatedImageSettings.h,
width: calculatedImageSettings.w,
x: calculatedImageSettings.x + margin,
y: calculatedImageSettings.y + margin,
preserveAspectRatio: "none",
opacity: calculatedImageSettings.opacity,
crossOrigin: calculatedImageSettings.crossOrigin
}
);
}
const fgPath = generatePath(cellsToDraw, margin);
return /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
"svg",
__spreadValues({
height: size,
width: size,
viewBox: `0 0 ${numCells} ${numCells}`,
ref: forwardedRef,
role: "img"
}, otherProps),
!!title && /* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("title", null, title),
/* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement(
"path",
{
fill: bgColor,
d: `M0,0 h${numCells}v${numCells}H0z`,
shapeRendering: "crispEdges"
}
),
/* @__PURE__ */ react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { fill: fgColor, d: fgPath, shapeRendering: "crispEdges" }),
image
);
}
);
QRCodeSVG.displayName = "QRCodeSVG";
/***/ }),
/***/ "../../../node_modules/qs/lib/formats.js":
/*!***********************************************!*\
!*** ../../../node_modules/qs/lib/formats.js ***!
\***********************************************/
/***/ ((module) => {
"use strict";
var replace = String.prototype.replace;
var percentTwenties = /%20/g;
var Format = {
RFC1738: 'RFC1738',
RFC3986: 'RFC3986'
};
module.exports = {
'default': Format.RFC3986,
formatters: {
RFC1738: function (value) {
return replace.call(value, percentTwenties, '+');
},
RFC3986: function (value) {
return String(value);
}
},
RFC1738: Format.RFC1738,
RFC3986: Format.RFC3986
};
/***/ }),
/***/ "../../../node_modules/qs/lib/index.js":
/*!*********************************************!*\
!*** ../../../node_modules/qs/lib/index.js ***!
\*********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var stringify = __webpack_require__(/*! ./stringify */ "../../../node_modules/qs/lib/stringify.js");
var parse = __webpack_require__(/*! ./parse */ "../../../node_modules/qs/lib/parse.js");
var formats = __webpack_require__(/*! ./formats */ "../../../node_modules/qs/lib/formats.js");
module.exports = {
formats: formats,
parse: parse,
stringify: stringify
};
/***/ }),
/***/ "../../../node_modules/qs/lib/parse.js":
/*!*********************************************!*\
!*** ../../../node_modules/qs/lib/parse.js ***!
\*********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var utils = __webpack_require__(/*! ./utils */ "../../../node_modules/qs/lib/utils.js");
var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;
var defaults = {
allowDots: false,
allowEmptyArrays: false,
allowPrototypes: false,
allowSparse: false,
arrayLimit: 20,
charset: 'utf-8',
charsetSentinel: false,
comma: false,
decodeDotInKeys: false,
decoder: utils.decode,
delimiter: '&',
depth: 5,
duplicates: 'combine',
ignoreQueryPrefix: false,
interpretNumericEntities: false,
parameterLimit: 1000,
parseArrays: true,
plainObjects: false,
strictDepth: false,
strictNullHandling: false
};
var interpretNumericEntities = function (str) {
return str.replace(/(\d+);/g, function ($0, numberStr) {
return String.fromCharCode(parseInt(numberStr, 10));
});
};
var parseArrayValue = function (val, options) {
if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
return val.split(',');
}
return val;
};
// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')
// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')
var parseValues = function parseQueryStringValues(str, options) {
var obj = { __proto__: null };
var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
cleanStr = cleanStr.replace(/%5B/gi, '[').replace(/%5D/gi, ']');
var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
var parts = cleanStr.split(options.delimiter, limit);
var skipIndex = -1; // Keep track of where the utf8 sentinel was found
var i;
var charset = options.charset;
if (options.charsetSentinel) {
for (i = 0; i < parts.length; ++i) {
if (parts[i].indexOf('utf8=') === 0) {
if (parts[i] === charsetSentinel) {
charset = 'utf-8';
} else if (parts[i] === isoSentinel) {
charset = 'iso-8859-1';
}
skipIndex = i;
i = parts.length; // The eslint settings do not allow break;
}
}
}
for (i = 0; i < parts.length; ++i) {
if (i === skipIndex) {
continue;
}
var part = parts[i];
var bracketEqualsPos = part.indexOf(']=');
var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;
var key, val;
if (pos === -1) {
key = options.decoder(part, defaults.decoder, charset, 'key');
val = options.strictNullHandling ? null : '';
} else {
key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
val = utils.maybeMap(
parseArrayValue(part.slice(pos + 1), options),
function (encodedVal) {
return options.decoder(encodedVal, defaults.decoder, charset, 'value');
}
);
}
if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
val = interpretNumericEntities(val);
}
if (part.indexOf('[]=') > -1) {
val = isArray(val) ? [val] : val;
}
var existing = has.call(obj, key);
if (existing && options.duplicates === 'combine') {
obj[key] = utils.combine(obj[key], val);
} else if (!existing || options.duplicates === 'last') {
obj[key] = val;
}
}
return obj;
};
var parseObject = function (chain, val, options, valuesParsed) {
var leaf = valuesParsed ? val : parseArrayValue(val, options);
for (var i = chain.length - 1; i >= 0; --i) {
var obj;
var root = chain[i];
if (root === '[]' && options.parseArrays) {
obj = options.allowEmptyArrays && (leaf === '' || (options.strictNullHandling && leaf === null))
? []
: [].concat(leaf);
} else {
obj = options.plainObjects ? Object.create(null) : {};
var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot;
var index = parseInt(decodedRoot, 10);
if (!options.parseArrays && decodedRoot === '') {
obj = { 0: leaf };
} else if (
!isNaN(index)
&& root !== decodedRoot
&& String(index) === decodedRoot
&& index >= 0
&& (options.parseArrays && index <= options.arrayLimit)
) {
obj = [];
obj[index] = leaf;
} else if (decodedRoot !== '__proto__') {
obj[decodedRoot] = leaf;
}
}
leaf = obj;
}
return leaf;
};
var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
if (!givenKey) {
return;
}
// Transform dot notation to bracket notation
var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
// The regex chunks
var brackets = /(\[[^[\]]*])/;
var child = /(\[[^[\]]*])/g;
// Get the parent
var segment = options.depth > 0 && brackets.exec(key);
var parent = segment ? key.slice(0, segment.index) : key;
// Stash the parent if it exists
var keys = [];
if (parent) {
// If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
if (!options.plainObjects && has.call(Object.prototype, parent)) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(parent);
}
// Loop through children appending to the array until we hit depth
var i = 0;
while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
// If there's a remainder, check strictDepth option for throw, else just add whatever is left
if (segment) {
if (options.strictDepth === true) {
throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');
}
keys.push('[' + key.slice(segment.index) + ']');
}
return parseObject(keys, val, options, valuesParsed);
};
var normalizeParseOptions = function normalizeParseOptions(opts) {
if (!opts) {
return defaults;
}
if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {
throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');
}
if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') {
throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided');
}
if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') {
throw new TypeError('Decoder has to be a function.');
}
if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
}
var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;
var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates;
if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') {
throw new TypeError('The duplicates option must be either combine, first, or last');
}
var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;
return {
allowDots: allowDots,
allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,
allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
charset: charset,
charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys,
decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
// eslint-disable-next-line no-implicit-coercion, no-extra-parens
depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
duplicates: duplicates,
ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
parseArrays: opts.parseArrays !== false,
plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,
strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
};
};
module.exports = function (str, opts) {
var options = normalizeParseOptions(opts);
if (str === '' || str === null || typeof str === 'undefined') {
return options.plainObjects ? Object.create(null) : {};
}
var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
var obj = options.plainObjects ? Object.create(null) : {};
// Iterate over the keys and setup the new object
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
obj = utils.merge(obj, newObj, options);
}
if (options.allowSparse === true) {
return obj;
}
return utils.compact(obj);
};
/***/ }),
/***/ "../../../node_modules/qs/lib/stringify.js":
/*!*************************************************!*\
!*** ../../../node_modules/qs/lib/stringify.js ***!
\*************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var getSideChannel = __webpack_require__(/*! side-channel */ "../../../node_modules/side-channel/index.js");
var utils = __webpack_require__(/*! ./utils */ "../../../node_modules/qs/lib/utils.js");
var formats = __webpack_require__(/*! ./formats */ "../../../node_modules/qs/lib/formats.js");
var has = Object.prototype.hasOwnProperty;
var arrayPrefixGenerators = {
brackets: function brackets(prefix) {
return prefix + '[]';
},
comma: 'comma',
indices: function indices(prefix, key) {
return prefix + '[' + key + ']';
},
repeat: function repeat(prefix) {
return prefix;
}
};
var isArray = Array.isArray;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};
var toISO = Date.prototype.toISOString;
var defaultFormat = formats['default'];
var defaults = {
addQueryPrefix: false,
allowDots: false,
allowEmptyArrays: false,
arrayFormat: 'indices',
charset: 'utf-8',
charsetSentinel: false,
delimiter: '&',
encode: true,
encodeDotInKeys: false,
encoder: utils.encode,
encodeValuesOnly: false,
format: defaultFormat,
formatter: formats.formatters[defaultFormat],
// deprecated
indices: false,
serializeDate: function serializeDate(date) {
return toISO.call(date);
},
skipNulls: false,
strictNullHandling: false
};
var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
return typeof v === 'string'
|| typeof v === 'number'
|| typeof v === 'boolean'
|| typeof v === 'symbol'
|| typeof v === 'bigint';
};
var sentinel = {};
var stringify = function stringify(
object,
prefix,
generateArrayPrefix,
commaRoundTrip,
allowEmptyArrays,
strictNullHandling,
skipNulls,
encodeDotInKeys,
encoder,
filter,
sort,
allowDots,
serializeDate,
format,
formatter,
encodeValuesOnly,
charset,
sideChannel
) {
var obj = object;
var tmpSc = sideChannel;
var step = 0;
var findFlag = false;
while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
// Where object last appeared in the ref tree
var pos = tmpSc.get(object);
step += 1;
if (typeof pos !== 'undefined') {
if (pos === step) {
throw new RangeError('Cyclic object value');
} else {
findFlag = true; // Break while
}
}
if (typeof tmpSc.get(sentinel) === 'undefined') {
step = 0;
}
}
if (typeof filter === 'function') {
obj = filter(prefix, obj);
} else if (obj instanceof Date) {
obj = serializeDate(obj);
} else if (generateArrayPrefix === 'comma' && isArray(obj)) {
obj = utils.maybeMap(obj, function (value) {
if (value instanceof Date) {
return serializeDate(value);
}
return value;
});
}
if (obj === null) {
if (strictNullHandling) {
return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
}
obj = '';
}
if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
if (encoder) {
var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
}
return [formatter(prefix) + '=' + formatter(String(obj))];
}
var values = [];
if (typeof obj === 'undefined') {
return values;
}
var objKeys;
if (generateArrayPrefix === 'comma' && isArray(obj)) {
// we need to join elements in
if (encodeValuesOnly && encoder) {
obj = utils.maybeMap(obj, encoder);
}
objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
} else if (isArray(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
var encodedPrefix = encodeDotInKeys ? prefix.replace(/\./g, '%2E') : prefix;
var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix;
if (allowEmptyArrays && isArray(obj) && obj.length === 0) {
return adjustedPrefix + '[]';
}
for (var j = 0; j < objKeys.length; ++j) {
var key = objKeys[j];
var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];
if (skipNulls && value === null) {
continue;
}
var encodedKey = allowDots && encodeDotInKeys ? key.replace(/\./g, '%2E') : key;
var keyPrefix = isArray(obj)
? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix
: adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']');
sideChannel.set(object, step);
var valueSideChannel = getSideChannel();
valueSideChannel.set(sentinel, sideChannel);
pushToArray(values, stringify(
value,
keyPrefix,
generateArrayPrefix,
commaRoundTrip,
allowEmptyArrays,
strictNullHandling,
skipNulls,
encodeDotInKeys,
generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder,
filter,
sort,
allowDots,
serializeDate,
format,
formatter,
encodeValuesOnly,
charset,
valueSideChannel
));
}
return values;
};
var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
if (!opts) {
return defaults;
}
if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {
throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');
}
if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {
throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');
}
if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
throw new TypeError('Encoder has to be a function.');
}
var charset = opts.charset || defaults.charset;
if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
}
var format = formats['default'];
if (typeof opts.format !== 'undefined') {
if (!has.call(formats.formatters, opts.format)) {
throw new TypeError('Unknown format option provided.');
}
format = opts.format;
}
var formatter = formats.formatters[format];
var filter = defaults.filter;
if (typeof opts.filter === 'function' || isArray(opts.filter)) {
filter = opts.filter;
}
var arrayFormat;
if (opts.arrayFormat in arrayPrefixGenerators) {
arrayFormat = opts.arrayFormat;
} else if ('indices' in opts) {
arrayFormat = opts.indices ? 'indices' : 'repeat';
} else {
arrayFormat = defaults.arrayFormat;
}
if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {
throw new TypeError('`commaRoundTrip` must be a boolean, or absent');
}
var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;
return {
addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
allowDots: allowDots,
allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,
arrayFormat: arrayFormat,
charset: charset,
charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
commaRoundTrip: opts.commaRoundTrip,
delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,
encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
filter: filter,
format: format,
formatter: formatter,
serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
sort: typeof opts.sort === 'function' ? opts.sort : null,
strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
};
};
module.exports = function (object, opts) {
var obj = object;
var options = normalizeStringifyOptions(opts);
var objKeys;
var filter;
if (typeof options.filter === 'function') {
filter = options.filter;
obj = filter('', obj);
} else if (isArray(options.filter)) {
filter = options.filter;
objKeys = filter;
}
var keys = [];
if (typeof obj !== 'object' || obj === null) {
return '';
}
var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];
var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (options.sort) {
objKeys.sort(options.sort);
}
var sideChannel = getSideChannel();
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (options.skipNulls && obj[key] === null) {
continue;
}
pushToArray(keys, stringify(
obj[key],
key,
generateArrayPrefix,
commaRoundTrip,
options.allowEmptyArrays,
options.strictNullHandling,
options.skipNulls,
options.encodeDotInKeys,
options.encode ? options.encoder : null,
options.filter,
options.sort,
options.allowDots,
options.serializeDate,
options.format,
options.formatter,
options.encodeValuesOnly,
options.charset,
sideChannel
));
}
var joined = keys.join(options.delimiter);
var prefix = options.addQueryPrefix === true ? '?' : '';
if (options.charsetSentinel) {
if (options.charset === 'iso-8859-1') {
// encodeURIComponent('✓'), the "numeric entity" representation of a checkmark
prefix += 'utf8=%26%2310003%3B&';
} else {
// encodeURIComponent('✓')
prefix += 'utf8=%E2%9C%93&';
}
}
return joined.length > 0 ? prefix + joined : '';
};
/***/ }),
/***/ "../../../node_modules/qs/lib/utils.js":
/*!*********************************************!*\
!*** ../../../node_modules/qs/lib/utils.js ***!
\*********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var formats = __webpack_require__(/*! ./formats */ "../../../node_modules/qs/lib/formats.js");
var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;
var hexTable = (function () {
var array = [];
for (var i = 0; i < 256; ++i) {
array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
}
return array;
}());
var compactQueue = function compactQueue(queue) {
while (queue.length > 1) {
var item = queue.pop();
var obj = item.obj[item.prop];
if (isArray(obj)) {
var compacted = [];
for (var j = 0; j < obj.length; ++j) {
if (typeof obj[j] !== 'undefined') {
compacted.push(obj[j]);
}
}
item.obj[item.prop] = compacted;
}
}
};
var arrayToObject = function arrayToObject(source, options) {
var obj = options && options.plainObjects ? Object.create(null) : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== 'undefined') {
obj[i] = source[i];
}
}
return obj;
};
var merge = function merge(target, source, options) {
/* eslint no-param-reassign: 0 */
if (!source) {
return target;
}
if (typeof source !== 'object') {
if (isArray(target)) {
target.push(source);
} else if (target && typeof target === 'object') {
if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
target[source] = true;
}
} else {
return [target, source];
}
return target;
}
if (!target || typeof target !== 'object') {
return [target].concat(source);
}
var mergeTarget = target;
if (isArray(target) && !isArray(source)) {
mergeTarget = arrayToObject(target, options);
}
if (isArray(target) && isArray(source)) {
source.forEach(function (item, i) {
if (has.call(target, i)) {
var targetItem = target[i];
if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
target[i] = merge(targetItem, item, options);
} else {
target.push(item);
}
} else {
target[i] = item;
}
});
return target;
}
return Object.keys(source).reduce(function (acc, key) {
var value = source[key];
if (has.call(acc, key)) {
acc[key] = merge(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
var assign = function assignSingleSource(target, source) {
return Object.keys(source).reduce(function (acc, key) {
acc[key] = source[key];
return acc;
}, target);
};
var decode = function (str, decoder, charset) {
var strWithoutPlus = str.replace(/\+/g, ' ');
if (charset === 'iso-8859-1') {
// unescape never throws, no try...catch needed:
return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
}
// utf-8
try {
return decodeURIComponent(strWithoutPlus);
} catch (e) {
return strWithoutPlus;
}
};
var limit = 1024;
/* eslint operator-linebreak: [2, "before"] */
var encode = function encode(str, defaultEncoder, charset, kind, format) {
// This code was originally written by Brian White (mscdex) for the io.js core querystring library.
// It has been adapted here for stricter adherence to RFC 3986
if (str.length === 0) {
return str;
}
var string = str;
if (typeof str === 'symbol') {
string = Symbol.prototype.toString.call(str);
} else if (typeof str !== 'string') {
string = String(str);
}
if (charset === 'iso-8859-1') {
return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
});
}
var out = '';
for (var j = 0; j < string.length; j += limit) {
var segment = string.length >= limit ? string.slice(j, j + limit) : string;
var arr = [];
for (var i = 0; i < segment.length; ++i) {
var c = segment.charCodeAt(i);
if (
c === 0x2D // -
|| c === 0x2E // .
|| c === 0x5F // _
|| c === 0x7E // ~
|| (c >= 0x30 && c <= 0x39) // 0-9
|| (c >= 0x41 && c <= 0x5A) // a-z
|| (c >= 0x61 && c <= 0x7A) // A-Z
|| (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
) {
arr[arr.length] = segment.charAt(i);
continue;
}
if (c < 0x80) {
arr[arr.length] = hexTable[c];
continue;
}
if (c < 0x800) {
arr[arr.length] = hexTable[0xC0 | (c >> 6)]
+ hexTable[0x80 | (c & 0x3F)];
continue;
}
if (c < 0xD800 || c >= 0xE000) {
arr[arr.length] = hexTable[0xE0 | (c >> 12)]
+ hexTable[0x80 | ((c >> 6) & 0x3F)]
+ hexTable[0x80 | (c & 0x3F)];
continue;
}
i += 1;
c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));
arr[arr.length] = hexTable[0xF0 | (c >> 18)]
+ hexTable[0x80 | ((c >> 12) & 0x3F)]
+ hexTable[0x80 | ((c >> 6) & 0x3F)]
+ hexTable[0x80 | (c & 0x3F)];
}
out += arr.join('');
}
return out;
};
var compact = function compact(value) {
var queue = [{ obj: { o: value }, prop: 'o' }];
var refs = [];
for (var i = 0; i < queue.length; ++i) {
var item = queue[i];
var obj = item.obj[item.prop];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var val = obj[key];
if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
queue.push({ obj: obj, prop: key });
refs.push(val);
}
}
}
compactQueue(queue);
return value;
};
var isRegExp = function isRegExp(obj) {
return Object.prototype.toString.call(obj) === '[object RegExp]';
};
var isBuffer = function isBuffer(obj) {
if (!obj || typeof obj !== 'object') {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
var combine = function combine(a, b) {
return [].concat(a, b);
};
var maybeMap = function maybeMap(val, fn) {
if (isArray(val)) {
var mapped = [];
for (var i = 0; i < val.length; i += 1) {
mapped.push(fn(val[i]));
}
return mapped;
}
return fn(val);
};
module.exports = {
arrayToObject: arrayToObject,
assign: assign,
combine: combine,
compact: compact,
decode: decode,
encode: encode,
isBuffer: isBuffer,
isRegExp: isRegExp,
maybeMap: maybeMap,
merge: merge
};
/***/ })
}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfbm90aWZsaXhfZGlzdF9ub3RpZmxpeC1haW8tM18yXzhfbWluX2pzLW5vZGVfbW9kdWxlc19vYmplY3QtaW5zcGVjdF9pbmRlLTkwOGYwZC52b2x1bnRlZXJhcGkuZmUzMjBkZTY1MTg1Nzk1ZmFiNjkuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBRUEsZUFBZSxLQUFxQyxDQUFDLGlDQUFPLEVBQUUsbUNBQUMsV0FBVyxZQUFZO0FBQUEsa0dBQUMsQ0FBQyxDQUE0RixDQUFDLHNCQUFzQixxQkFBTSx3Q0FBd0MscUJBQU0sYUFBYSxhQUFhLGtFQUFrRSw0TkFBNE4sa0VBQWtFLElBQUksNmpCQUE2akIsNk9BQTZPLFVBQVUsNE9BQTRPLFVBQVUsbVBBQW1QLE9BQU8sME9BQTBPLElBQUksa0VBQWtFLElBQUksMmNBQTJjLHFKQUFxSixVQUFVLG9KQUFvSixVQUFVLHFKQUFxSixPQUFPLHNKQUFzSixJQUFJLHNDQUFzQyxJQUFJLDJsQkFBMmxCLElBQUksd0lBQXdJLElBQUksc1dBQXNXLElBQUksb0dBQW9HLElBQUksMlRBQTJULGVBQWUsdURBQXVELG1CQUFtQixXQUFXLDhCQUE4QixlQUFlLG9EQUFvRCxtQkFBbUIsV0FBVyw4QkFBOEIsZUFBZSxzTEFBc0wsaUJBQWlCLHVCQUF1Qiw4Q0FBOEMsd0NBQXdDLHVEQUF1RCxjQUFjLFFBQVEsVUFBVSx3RkFBd0Ysc0JBQXNCLGdKQUFnSixtQkFBbUIsb0JBQW9CLFNBQVMsZUFBZSxzQ0FBc0Msb0RBQW9ELGlCQUFpQixnQ0FBZ0MscU1BQXFNLEdBQUcsK0VBQStFLHVFQUF1RSxPQUFPLDZFQUE2RSxxRUFBcUUsSUFBSSxpRkFBaUYsMEVBQTBFLHNDQUFzQyxHQUFHLCtFQUErRSx1RUFBdUUsT0FBTyw2RUFBNkUscUVBQXFFLElBQUksaUZBQWlGLDBFQUEwRSw4Q0FBOEMsR0FBRyxVQUFVLE9BQU8sV0FBVyxzQ0FBc0MsR0FBRyxVQUFVLE9BQU8s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O0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLElBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLDBCQUEwQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsWUFBWTtBQUNsQyx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsUUFBUTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyx1REFBdUQ7QUFDMUQsQ0FBQyw4QkFBOEI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixPQUFPLFVBQVUsYUFBYTtBQUNqRDs7QUFFQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvbm90aWZsaXgvZGlzdC9ub3RpZmxpeC1haW8tMy4yLjgubWluLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvaGFzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xcmNvZGUucmVhY3QvbGliL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIE5vdGlmbGl4IEFJTyAoaHR0cHM6Ly9ub3RpZmxpeC5naXRodWIuaW8pIC0gVmVyc2lvbjogMy4yLjggLSBBdXRob3I6IEZ1cmthbiAoaHR0cHM6Ly9naXRodWIuY29tL2Z1cmNhbikgLSBDb3B5cmlnaHQgMjAxOSAtIDIwMjUgTm90aWZsaXgsIE1JVCBMaWNlbnNlIChodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkgKi9cblxuKGZ1bmN0aW9uKHQsZSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBlKHQpfSk6XCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUodCk6dC5Ob3RpZmxpeD1lKHQpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGdsb2JhbD9cInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93P3RoaXM6d2luZG93Omdsb2JhbCxmdW5jdGlvbih0KXsndXNlIHN0cmljdCc7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIHQmJlwidW5kZWZpbmVkXCI9PXR5cGVvZiB0LmRvY3VtZW50KXJldHVybiExO3ZhciBlLGksYSxuLG8scj1cIlxcblxcblZpc2l0IGRvY3VtZW50YXRpb24gcGFnZSB0byBsZWFybiBtb3JlOiBodHRwczovL25vdGlmbGl4LmdpdGh1Yi5pby9kb2N1bWVudGF0aW9uXCIscz1cIi1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBBcmlhbCwgXFxcIk5vdG8gU2Fuc1xcXCIsIHNhbnMtc2VyaWZcIixsPXtTdWNjZXNzOlwiU3VjY2Vzc1wiLEZhaWx1cmU6XCJGYWlsdXJlXCIsV2FybmluZzpcIldhcm5pbmdcIixJbmZvOlwiSW5mb1wifSxtPXt3cmFwSUQ6XCJOb3RpZmxpeE5vdGlmeVdyYXBcIixvdmVybGF5SUQ6XCJOb3RpZmxpeE5vdGlmeU92ZXJsYXlcIix3aWR0aDpcIjI4MHB4XCIscG9zaXRpb246XCJyaWdodC10b3BcIixkaXN0YW5jZTpcIjEwcHhcIixvcGFjaXR5OjEsYm9yZGVyUmFkaXVzOlwiNXB4XCIscnRsOiExLHRpbWVvdXQ6M2UzLG1lc3NhZ2VNYXhMZW5ndGg6MTEwLGJhY2tPdmVybGF5OiExLGJhY2tPdmVybGF5Q29sb3I6XCJyZ2JhKDAsMCwwLDAuNSlcIixwbGFpblRleHQ6ITAsc2hvd09ubHlUaGVMYXN0T25lOiExLGNsaWNrVG9DbG9zZTohMSxwYXVzZU9uSG92ZXI6ITAsSUQ6XCJOb3RpZmxpeE5vdGlmeVwiLGNsYXNzTmFtZTpcIm5vdGlmbGl4LW5vdGlmeVwiLHppbmRleDo0MDAxLGZvbnRGYW1pbHk6XCJRdWlja3NhbmRcIixmb250U2l6ZTpcIjEzcHhcIixjc3NBbmltYXRpb246ITAsY3NzQW5pbWF0aW9uRHVyYXRpb246NDAwLGNzc0FuaW1hdGlvblN0eWxlOlwiZmFkZVwiLGNsb3NlQnV0dG9uOiExLHVzZUljb246ITAsdXNlRm9udEF3ZXNvbWU6ITEsZm9udEF3ZXNvbWVJY29uU3R5bGU6XCJiYXNpY1wiLGZvbnRBd2Vzb21lSWNvblNpemU6XCIzNHB4XCIsc3VjY2Vzczp7YmFja2dyb3VuZDpcIiMzMmM2ODJcIix0ZXh0Q29sb3I6XCIjZmZmXCIsY2hpbGRDbGFzc05hbWU6XCJub3RpZmxpeC1ub3RpZnktc3VjY2Vzc1wiLG5vdGlmbGl4SWNvbkNvbG9yOlwicmdiYSgwLDAsMCwwLjIpXCIsZm9udEF3ZXNvbWVDbGFzc05hbWU6XCJmYXMgZmEtY2hlY2stY2lyY2xlXCIsZm9udEF3ZXNvbWVJY29uQ29sb3I6XCJyZ2JhKDAsMCwwLDAuMilcIixiYWNrT3ZlcmxheUNvbG9yOlwicmdiYSg1MCwxOTgsMTMwLDAuMilcIn0sZmFpbHVyZTp7YmFja2dyb3VuZDpcIiNmZjU1NDlcIix0ZXh0Q29sb3I6XCIjZmZmXCIsY2hpbGRDbGFzc05hbWU6XCJub3RpZmxpeC1ub3RpZnktZmFpbHVyZVwiLG5vdGlmbGl4SWNvbkNvbG9yOlwicmdiYSgwLDAsMCwwLjIpXCIsZm9udEF3ZXNvbWVDbGFzc05hbWU6XCJmYXMgZmEtdGltZXMtY2lyY2xlXCIsZm9udEF3ZXNvbWVJY29uQ29sb3I6XCJyZ2JhKDAsMCwwLDAuMilcIixiYWNrT3ZlcmxheUNvbG9yOlwicmdiYSgyNTUsODUsNzMsMC4yKVwifSx3YXJuaW5nOntiYWNrZ3JvdW5kOlwiI2VlYmYzMVwiLHRleHRDb2xvcjpcIiNmZmZcIixjaGlsZENsYXNzTmFtZTpcIm5vdGlmbGl4LW5vdGlmeS13YXJuaW5nXCIsbm90aWZsaXhJY29uQ29sb3I6XCJyZ2JhKDAsMCwwLDAuMilcIixmb250QXdlc29tZUNsYXNzTmFtZTpcImZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGVcIixmb250QXdlc29tZUljb25Db2xvcjpcInJnYmEoMCwwLDAsMC4yKVwiLGJhY2tPdmVybGF5Q29sb3I6XCJyZ2JhKDIzOCwxOTEsNDksMC4yKVwifSxpbmZvOntiYWNrZ3JvdW5kOlwiIzI2YzBkM1wiLHRleHRDb2xvcjpcIiNmZmZcIixjaGlsZENsYXNzTmFtZTpcIm5vdGlmbGl4LW5vdGlmeS1pbmZvXCIsbm90aWZsaXhJY29uQ29sb3I6XCJyZ2JhKDAsMCwwLDAuMilcIixmb250QXdlc29tZUNsYXNzTmFtZTpcImZhcyBmYS1pbmZvLWNpcmNsZVwiLGZvbnRBd2Vzb21lSWNvbkNvbG9yOlwicmdiYSgwLDAsMCwwLjIpXCIsYmFja092ZXJsYXlDb2xvcjpcInJnYmEoMzgsMTkyLDIxMSwwLjIpXCJ9fSxjPXtTdWNjZXNzOlwiU3VjY2Vzc1wiLEZhaWx1cmU6XCJGYWlsdXJlXCIsV2FybmluZzpcIldhcm5pbmdcIixJbmZvOlwiSW5mb1wifSxwPXtJRDpcIk5vdGlmbGl4UmVwb3J0V3JhcFwiLGNsYXNzTmFtZTpcIm5vdGlmbGl4LXJlcG9ydFwiLHdpZHRoOlwiMzIwcHhcIixiYWNrZ3JvdW5kQ29sb3I6XCIjZjhmOGY4XCIsYm9yZGVyUmFkaXVzOlwiMjVweFwiLHJ0bDohMSx6aW5kZXg6NDAwMixiYWNrT3ZlcmxheTohMCxiYWNrT3ZlcmxheUNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIsYmFja092ZXJsYXlDbGlja1RvQ2xvc2U6ITEsZm9udEZhbWlseTpcIlF1aWNrc2FuZFwiLHN2Z1NpemU6XCIxMTBweFwiLHBsYWluVGV4dDohMCx0aXRsZUZvbnRTaXplOlwiMTZweFwiLHRpdGxlTWF4TGVuZ3RoOjM0LG1lc3NhZ2VGb250U2l6ZTpcIjEzcHhcIixtZXNzYWdlTWF4TGVuZ3RoOjQwMCxidXR0b25Gb250U2l6ZTpcIjE0cHhcIixidXR0b25NYXhMZW5ndGg6MzQsY3NzQW5pbWF0aW9uOiEwLGNzc0FuaW1hdGlvbkR1cmF0aW9uOjM2MCxjc3NBbmltYXRpb25TdHlsZTpcImZhZGVcIixzdWNjZXNzOntzdmdDb2xvcjpcIiMzMmM2ODJcIix0aXRsZUNvbG9yOlwiIzFlMWUxZVwiLG1lc3NhZ2VDb2xvcjpcIiMyNDI0MjRcIixidXR0b25CYWNrZ3JvdW5kOlwiIzMyYzY4MlwiLGJ1dHRvbkNvbG9yOlwiI2ZmZlwiLGJhY2tPdmVybGF5Q29sb3I6XCJyZ2JhKDUwLDE5OCwxMzAsMC4yKVwifSxmYWlsdXJlOntzdmdDb2xvcjpcIiNmZjU1NDlcIix0aXRsZUNvbG9yOlwiIzFlMWUxZVwiLG1lc3NhZ2VDb2xvcjpcIiMyNDI0MjRcIixidXR0b25CYWNrZ3JvdW5kOlwiI2ZmNTU0OVwiLGJ1dHRvbkNvbG9yOlwiI2ZmZlwiLGJhY2tPdmVybGF5Q29sb3I6XCJyZ2JhKDI1NSw4NSw3MywwLjIpXCJ9LHdhcm5pbmc6e3N2Z0NvbG9yOlwiI2VlYmYzMVwiLHRpdGxlQ29sb3I6XCIjMWUxZTFlXCIsbWVzc2FnZUNvbG9yOlwiIzI0MjQyNFwiLGJ1dHRvbkJhY2tncm91bmQ6XCIjZWViZjMxXCIsYnV0dG9uQ29sb3I6XCIjZmZmXCIsYmFja092ZXJsYXlDb2xvcjpcInJnYmEoMjM4LDE5MSw0OSwwLjIpXCJ9LGluZm86e3N2Z0NvbG9yOlwiIzI2YzBkM1wiLHRpdGxlQ29sb3I6XCIjMWUxZTFlXCIsbWVzc2FnZUNvbG9yOlwiIzI0MjQyNFwiLGJ1dHRvbkJhY2tncm91bmQ6XCIjMjZjMGQzXCIsYnV0dG9uQ29sb3I6XCIjZmZmXCIsYmFja092ZXJsYXlDb2xvcjpcInJnYmEoMzgsMTkyLDIxMSwwLjIpXCJ9fSxmPXtTaG93OlwiU2hvd1wiLEFzazpcIkFza1wiLFByb21wdDpcIlByb21wdFwifSxkPXtJRDpcIk5vdGlmbGl4Q29uZmlybVdyYXBcIixjbGFzc05hbWU6XCJub3RpZmxpeC1jb25maXJtXCIsd2lkdGg6XCIzMDBweFwiLHppbmRleDo0MDAzLHBvc2l0aW9uOlwiY2VudGVyXCIsZGlzdGFuY2U6XCIxMHB4XCIsYmFja2dyb3VuZENvbG9yOlwiI2Y4ZjhmOFwiLGJvcmRlclJhZGl1czpcIjI1cHhcIixiYWNrT3ZlcmxheTohMCxiYWNrT3ZlcmxheUNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIscnRsOiExLGZvbnRGYW1pbHk6XCJRdWlja3NhbmRcIixjc3NBbmltYXRpb246ITAsY3NzQW5pbWF0aW9uRHVyYXRpb246MzAwLGNzc0FuaW1hdGlvblN0eWxlOlwiZmFkZVwiLHBsYWluVGV4dDohMCx0aXRsZUNvbG9yOlwiIzMyYzY4MlwiLHRpdGxlRm9udFNpemU6XCIxNnB4XCIsdGl0bGVNYXhMZW5ndGg6MzQsbWVzc2FnZUNvbG9yOlwiIzFlMWUxZVwiLG1lc3NhZ2VGb250U2l6ZTpcIjE0cHhcIixtZXNzYWdlTWF4TGVuZ3RoOjExMCxidXR0b25zRm9udFNpemU6XCIxNXB4XCIsYnV0dG9uc01heExlbmd0aDozNCxva0J1dHRvbkNvbG9yOlwiI2Y4ZjhmOFwiLG9rQnV0dG9uQmFja2dyb3VuZDpcIiMzMmM2ODJcIixjYW5jZWxCdXR0b25Db2xvcjpcIiNmOGY4ZjhcIixjYW5jZWxCdXR0b25CYWNrZ3JvdW5kOlwiI2E5YTlhOVwifSx4PXtTdGFuZGFyZDpcIlN0YW5kYXJkXCIsSG91cmdsYXNzOlwiSG91cmdsYXNzXCIsQ2lyY2xlOlwiQ2lyY2xlXCIsQXJyb3dzOlwiQXJyb3dzXCIsRG90czpcIkRvdHNcIixQdWxzZTpcIlB1bHNlXCIsQ3VzdG9tOlwiQ3VzdG9tXCIsTm90aWZsaXg6XCJOb3RpZmxpeFwifSxnPXtJRDpcIk5vdGlmbGl4TG9hZGluZ1dyYXBcIixjbGFzc05hbWU6XCJub3RpZmxpeC1sb2FkaW5nXCIsemluZGV4OjRlMyxiYWNrZ3JvdW5kQ29sb3I6XCJyZ2JhKDAsMCwwLDAuOClcIixydGw6ITEsZm9udEZhbWlseTpcIlF1aWNrc2FuZFwiLGNzc0FuaW1hdGlvbjohMCxjc3NBbmltYXRpb25EdXJhdGlvbjo0MDAsY2xpY2tUb0Nsb3NlOiExLGN1c3RvbVN2Z1VybDpudWxsLGN1c3RvbVN2Z0NvZGU6bnVsbCxzdmdTaXplOlwiODBweFwiLHN2Z0NvbG9yOlwiIzMyYzY4MlwiLG1lc3NhZ2VJRDpcIk5vdGlmbGl4TG9hZGluZ01lc3NhZ2VcIixtZXNzYWdlRm9udFNpemU6XCIxNXB4XCIsbWVzc2FnZU1heExlbmd0aDozNCxtZXNzYWdlQ29sb3I6XCIjZGNkY2RjXCJ9LGI9e1N0YW5kYXJkOlwiU3RhbmRhcmRcIixIb3VyZ2xhc3M6XCJIb3VyZ2xhc3NcIixDaXJjbGU6XCJDaXJjbGVcIixBcnJvd3M6XCJBcnJvd3NcIixEb3RzOlwiRG90c1wiLFB1bHNlOlwiUHVsc2VcIn0sdT17SUQ6XCJOb3RpZmxpeEJsb2NrV3JhcFwiLHF1ZXJ5U2VsZWN0b3JMaW1pdDoyMDAsY2xhc3NOYW1lOlwibm90aWZsaXgtYmxvY2tcIixwb3NpdGlvbjpcImFic29sdXRlXCIsemluZGV4OjFlMyxiYWNrZ3JvdW5kQ29sb3I6XCJyZ2JhKDI1NSwyNTUsMjU1LDAuOSlcIixydGw6ITEsZm9udEZhbWlseTpcIlF1aWNrc2FuZFwiLGNzc0FuaW1hdGlvbjohMCxjc3NBbmltYXRpb25EdXJhdGlvbjozMDAsc3ZnU2l6ZTpcIjQ1cHhcIixzdmdDb2xvcjpcIiMzODM4MzhcIixtZXNzYWdlRm9udFNpemU6XCIxNHB4XCIsbWVzc2FnZU1heExlbmd0aDozNCxtZXNzYWdlQ29sb3I6XCIjMzgzODM4XCJ9LHk9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoXCIlYyBOb3RpZmxpeCBFcnJvciBcIixcInBhZGRpbmc6MnB4O2JvcmRlci1yYWRpdXM6MjBweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2ZmNTU0OVwiLFwiXFxuXCIrdCtyKX0saz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS5sb2coXCIlYyBOb3RpZmxpeCBJbmZvIFwiLFwicGFkZGluZzoycHg7Ym9yZGVyLXJhZGl1czoyMHB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZDojMjZjMGQzXCIsXCJcXG5cIit0K3IpfSx3PWZ1bmN0aW9uKGUpe3JldHVybiBlfHwoZT1cImhlYWRcIiksdm9pZCAwIT09dC5kb2N1bWVudFtlXXx8KHkoXCJcXG5Ob3RpZmxpeCBuZWVkcyB0byBiZSBhcHBlbmRlZCB0byB0aGUgXFxcIjxcIitlK1wiPlxcXCIgZWxlbWVudCwgYnV0IHlvdSBjYWxsZWQgaXQgYmVmb3JlIHRoZSBcXFwiPFwiK2UrXCI+XFxcIiBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQuXCIpLCExKX0saD1mdW5jdGlvbihlLGkpe2lmKCF3KFwiaGVhZFwiKSlyZXR1cm4hMTtpZihudWxsIT09ZSgpJiYhdC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKSl7dmFyIGE9dC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7YS5pZD1pLGEuaW5uZXJIVE1MPWUoKSx0LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fSx2PWZ1bmN0aW9uKCl7dmFyIHQ9e30sZT0hMSxhPTA7XCJbb2JqZWN0IEJvb2xlYW5dXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnRzWzBdKSYmKGU9YXJndW1lbnRzWzBdLGErKyk7Zm9yKHZhciBuPWZ1bmN0aW9uKGkpe2Zvcih2YXIgYSBpbiBpKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLGEpJiYodFthXT1lJiZcIltvYmplY3QgT2JqZWN0XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlbYV0pP3YodFthXSxpW2FdKTppW2FdKX07YTxhcmd1bWVudHMubGVuZ3RoO2ErKyluKGFyZ3VtZW50c1thXSk7cmV0dXJuIHR9LE49ZnVuY3Rpb24oZSl7dmFyIGk9dC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiBpLmlubmVySFRNTD1lLGkudGV4dENvbnRlbnR8fGkuaW5uZXJUZXh0fHxcIlwifSxDPWZ1bmN0aW9uKHQsZSl7dHx8KHQ9XCIxMTBweFwiKSxlfHwoZT1cIiMzMmM2ODJcIik7dmFyIGk9XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgaWQ9XFxcIk5YUmVwb3J0U3VjY2Vzc1xcXCIgd2lkdGg9XFxcIlwiK3QrXCJcXFwiIGhlaWdodD1cXFwiXCIrdCtcIlxcXCIgZmlsbD1cXFwiXCIrZStcIlxcXCIgdmlld0JveD1cXFwiMCAwIDEyMCAxMjBcXFwiPjxzdHlsZT5ALXdlYmtpdC1rZXlmcmFtZXMgTlhSZXBvcnRTdWNjZXNzMS1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNTcuN3B4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC01Ny43cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw1Ny43cHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTU3LjdweCl9NTAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDU3LjdweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTU3LjdweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDU3LjdweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTU3LjdweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDU3LjdweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC01Ny43cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw1Ny43cHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNTcuN3B4KX19QGtleWZyYW1lcyBOWFJlcG9ydFN1Y2Nlc3MxLWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw1Ny43cHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTU3LjdweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDU3LjdweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNTcuN3B4KX01MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNTcuN3B4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNTcuN3B4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNTcuN3B4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNTcuN3B4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNTcuN3B4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTU3LjdweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDU3LjdweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC01Ny43cHgpfX1ALXdlYmtpdC1rZXlmcmFtZXMgTlhSZXBvcnRTdWNjZXNzNC1hbmltYXRpb257MCV7b3BhY2l0eTowfTUwJSx0b3tvcGFjaXR5OjF9fUBrZXlmcmFtZXMgTlhSZXBvcnRTdWNjZXNzNC1hbmltYXRpb257MCV7b3BhY2l0eTowfTUwJSx0b3tvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydFN1Y2Nlc3MzLWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NDAlLHRve29wYWNpdHk6MX19QGtleWZyYW1lcyBOWFJlcG9ydFN1Y2Nlc3MzLWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NDAlLHRve29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0U3VjY2VzczItYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX00MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9fUBrZXlmcmFtZXMgTlhSZXBvcnRTdWNjZXNzMi1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTQwJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX19I05YUmVwb3J0U3VjY2VzcyAqey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjEuMnM7YW5pbWF0aW9uLWR1cmF0aW9uOjEuMnM7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDAsMSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDAsMSwxKX08L3N0eWxlPjxnIHN0eWxlPVxcXCItd2Via2l0LWFuaW1hdGlvbi1uYW1lOk5YUmVwb3J0U3VjY2VzczItYW5pbWF0aW9uO2FuaW1hdGlvbi1uYW1lOk5YUmVwb3J0U3VjY2VzczItYW5pbWF0aW9uOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiPjxwYXRoIGQ9XFxcIk02MCAxMTUuMzhDMjkuNDYgMTE1LjM4IDQuNjIgOTAuNTQgNC42MiA2MCA0LjYyIDI5LjQ2IDI5LjQ2IDQuNjIgNjAgNC42MmMzMC41NCAwIDU1LjM4IDI0Ljg0IDU1LjM4IDU1LjM4IDAgMzAuNTQtMjQuODQgNTUuMzgtNTUuMzggNTUuMzh6TTYwIDBDMjYuOTIgMCAwIDI2LjkyIDAgNjBzMjYuOTIgNjAgNjAgNjAgNjAtMjYuOTIgNjAtNjBTOTMuMDggMCA2MCAwelxcXCIgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRTdWNjZXNzMy1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRTdWNjZXNzMy1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpXFxcIiBmaWxsPVxcXCJpbmhlcml0XFxcIiBkYXRhLWFuaW1hdG9yLWdyb3VwPVxcXCJ0cnVlXFxcIiBkYXRhLWFuaW1hdG9yLXR5cGU9XFxcIjJcXFwiLz48L2c+PGcgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRTdWNjZXNzMS1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRTdWNjZXNzMS1hbmltYXRpb247LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNTcuN3B4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNTcuN3B4KTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiPjxwYXRoIGQ9XFxcIk04OC4yNyAzNS4zOUw1Mi44IDc1LjI5IDMxLjQzIDU4LjJjLS45OC0uODEtMi40NC0uNjMtMy4yNC4zNi0uNzkuOTktLjYzIDIuNDQuMzYgMy4yNGwyMy4wOCAxOC40NmMuNDMuMzQuOTMuNTEgMS40NC41MS42NCAwIDEuMjctLjI2IDEuNzQtLjc4bDM2LjkxLTQxLjUzYTIuMyAyLjMgMCAwIDAtLjE5LTMuMjZjLS45NS0uODYtMi40MS0uNzctMy4yNi4xOXpcXFwiIHN0eWxlPVxcXCItd2Via2l0LWFuaW1hdGlvbi1uYW1lOk5YUmVwb3J0U3VjY2VzczQtYW5pbWF0aW9uO2FuaW1hdGlvbi1uYW1lOk5YUmVwb3J0U3VjY2VzczQtYW5pbWF0aW9uOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKVxcXCIgZmlsbD1cXFwiaW5oZXJpdFxcXCIgZGF0YS1hbmltYXRvci1ncm91cD1cXFwidHJ1ZVxcXCIgZGF0YS1hbmltYXRvci10eXBlPVxcXCIyXFxcIi8+PC9nPjwvc3ZnPlwiO3JldHVybiBpfSx6PWZ1bmN0aW9uKHQsZSl7dHx8KHQ9XCIxMTBweFwiKSxlfHwoZT1cIiNmZjU1NDlcIik7dmFyIGk9XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgaWQ9XFxcIk5YUmVwb3J0RmFpbHVyZVxcXCIgd2lkdGg9XFxcIlwiK3QrXCJcXFwiIGhlaWdodD1cXFwiXCIrdCtcIlxcXCIgZmlsbD1cXFwiXCIrZStcIlxcXCIgdmlld0JveD1cXFwiMCAwIDEyMCAxMjBcXFwiPjxzdHlsZT5ALXdlYmtpdC1rZXlmcmFtZXMgTlhSZXBvcnRGYWlsdXJlMi1hbmltYXRpb257MCV7b3BhY2l0eTowfTQwJSx0b3tvcGFjaXR5OjF9fUBrZXlmcmFtZXMgTlhSZXBvcnRGYWlsdXJlMi1hbmltYXRpb257MCV7b3BhY2l0eTowfTQwJSx0b3tvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydEZhaWx1cmUxLWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NDAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTYwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfX1Aa2V5ZnJhbWVzIE5YUmVwb3J0RmFpbHVyZTEtYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX00MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9fUAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydEZhaWx1cmUzLWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NTAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTYwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfX1Aa2V5ZnJhbWVzIE5YUmVwb3J0RmFpbHVyZTMtYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX01MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9fUAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydEZhaWx1cmU0LWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NTAlLHRve29wYWNpdHk6MX19QGtleWZyYW1lcyBOWFJlcG9ydEZhaWx1cmU0LWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NTAlLHRve29wYWNpdHk6MX19I05YUmVwb3J0RmFpbHVyZSAqey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjEuMnM7YW5pbWF0aW9uLWR1cmF0aW9uOjEuMnM7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDAsMSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLDAsMSwxKX08L3N0eWxlPjxnIHN0eWxlPVxcXCItd2Via2l0LWFuaW1hdGlvbi1uYW1lOk5YUmVwb3J0RmFpbHVyZTEtYW5pbWF0aW9uO2FuaW1hdGlvbi1uYW1lOk5YUmVwb3J0RmFpbHVyZTEtYW5pbWF0aW9uOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweClcXFwiPjxwYXRoIGQ9XFxcIk00LjM1IDM0Ljk1YzAtMTYuODIgMTMuNzgtMzAuNiAzMC42LTMwLjZoNTAuMWMxNi44MiAwIDMwLjYgMTMuNzggMzAuNiAzMC42djUwLjFjMCAxNi44Mi0xMy43OCAzMC42LTMwLjYgMzAuNmgtNTAuMWMtMTYuODIgMC0zMC42LTEzLjc4LTMwLjYtMzAuNnYtNTAuMXpNMzQuOTUgMTIwaDUwLjFjMTkuMjIgMCAzNC45NS0xNS43MyAzNC45NS0zNC45NXYtNTAuMUMxMjAgMTUuNzMgMTA0LjI3IDAgODUuMDUgMGgtNTAuMUMxNS43MyAwIDAgMTUuNzMgMCAzNC45NXY1MC4xQzAgMTA0LjI3IDE1LjczIDEyMCAzNC45NSAxMjB6XFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydEZhaWx1cmUyLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydEZhaWx1cmUyLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiIGZpbGw9XFxcImluaGVyaXRcXFwiIGRhdGEtYW5pbWF0b3ItZ3JvdXA9XFxcInRydWVcXFwiIGRhdGEtYW5pbWF0b3ItdHlwZT1cXFwiMlxcXCIvPjwvZz48ZyBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydEZhaWx1cmUzLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydEZhaWx1cmUzLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpXFxcIj48cGF0aCBkPVxcXCJNODIuNCAzNy42Yy0uOS0uOS0yLjM3LS45LTMuMjcgMEw2MCA1Ni43MyA0MC44NiAzNy42YTIuMzA2IDIuMzA2IDAgMCAwLTMuMjYgMy4yNkw1Ni43MyA2MCAzNy42IDc5LjEzYy0uOS45LS45IDIuMzcgMCAzLjI3LjQ1LjQ1IDEuMDQuNjggMS42My42OC41OSAwIDEuMTgtLjIzIDEuNjMtLjY4TDYwIDYzLjI2IDc5LjEzIDgyLjRjLjQ1LjQ1IDEuMDUuNjggMS42NC42OC41OCAwIDEuMTgtLjIzIDEuNjMtLjY4LjktLjkuOS0yLjM3IDAtMy4yN0w2My4yNiA2MCA4Mi40IDQwLjg2Yy45LS45MS45LTIuMzYgMC0zLjI2elxcXCIgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRGYWlsdXJlNC1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRGYWlsdXJlNC1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpXFxcIiBmaWxsPVxcXCJpbmhlcml0XFxcIiBkYXRhLWFuaW1hdG9yLWdyb3VwPVxcXCJ0cnVlXFxcIiBkYXRhLWFuaW1hdG9yLXR5cGU9XFxcIjJcXFwiLz48L2c+PC9zdmc+XCI7cmV0dXJuIGl9LFM9ZnVuY3Rpb24odCxlKXt0fHwodD1cIjExMHB4XCIpLGV8fChlPVwiI2VlYmYzMVwiKTt2YXIgaT1cIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiBpZD1cXFwiTlhSZXBvcnRXYXJuaW5nXFxcIiB3aWR0aD1cXFwiXCIrdCtcIlxcXCIgaGVpZ2h0PVxcXCJcIit0K1wiXFxcIiBmaWxsPVxcXCJcIitlK1wiXFxcIiB2aWV3Qm94PVxcXCIwIDAgMTIwIDEyMFxcXCI+PHN0eWxlPkAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydFdhcm5pbmcyLWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NDAlLHRve29wYWNpdHk6MX19QGtleWZyYW1lcyBOWFJlcG9ydFdhcm5pbmcyLWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NDAlLHRve29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0V2FybmluZzEtYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX00MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9fUBrZXlmcmFtZXMgTlhSZXBvcnRXYXJuaW5nMS1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTQwJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0V2FybmluZzMtYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDY2LjZweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjYuNnB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjYuNnB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02Ni42cHgpfTUwJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2Ni42cHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02Ni42cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2Ni42cHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02Ni42cHgpfTYwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2Ni42cHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjYuNnB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjYuNnB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTY2LjZweCl9fUBrZXlmcmFtZXMgTlhSZXBvcnRXYXJuaW5nMy1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjYuNnB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02Ni42cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2Ni42cHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTY2LjZweCl9NTAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDY2LjZweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTY2LjZweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDY2LjZweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTY2LjZweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDY2LjZweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02Ni42cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2Ni42cHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjYuNnB4KX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0V2FybmluZzQtYW5pbWF0aW9uezAle29wYWNpdHk6MH01MCUsdG97b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIE5YUmVwb3J0V2FybmluZzQtYW5pbWF0aW9uezAle29wYWNpdHk6MH01MCUsdG97b3BhY2l0eToxfX0jTlhSZXBvcnRXYXJuaW5nICp7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MS4yczthbmltYXRpb24tZHVyYXRpb246MS4yczstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsMCwxLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsMCwxLDEpfTwvc3R5bGU+PGcgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRXYXJuaW5nMS1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRXYXJuaW5nMS1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KVxcXCI+PHBhdGggZD1cXFwiTTExNS40NiAxMDYuMTVsLTU0LjA0LTkzLjhjLS42MS0xLjA2LTIuMjMtMS4wNi0yLjg0IDBsLTU0LjA0IDkzLjhjLS42MiAxLjA3LjIxIDIuMjkgMS40MiAyLjI5aDEwOC4wOGMxLjIxIDAgMi4wNC0xLjIyIDEuNDItMi4yOXpNNjUuMTcgMTAuMmw1NC4wNCA5My44YzIuMjggMy45Ni0uNjUgOC43OC01LjE3IDguNzhINS45NmMtNC41MiAwLTcuNDUtNC44Mi01LjE3LTguNzhsNTQuMDQtOTMuOGMyLjI4LTMuOTUgOC4wMy00IDEwLjM0IDB6XFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydFdhcm5pbmcyLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydFdhcm5pbmcyLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiIGZpbGw9XFxcImluaGVyaXRcXFwiIGRhdGEtYW5pbWF0b3ItZ3JvdXA9XFxcInRydWVcXFwiIGRhdGEtYW5pbWF0b3ItdHlwZT1cXFwiMlxcXCIvPjwvZz48ZyBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydFdhcm5pbmczLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydFdhcm5pbmczLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjYuNnB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjYuNnB4KVxcXCI+PHBhdGggZD1cXFwiTTU3LjgzIDk0LjAxYzAgMS4yLjk3IDIuMTcgMi4xNyAyLjE3czIuMTctLjk3IDIuMTctMi4xN3YtMy4yYzAtMS4yLS45Ny0yLjE3LTIuMTctMi4xN3MtMi4xNy45Ny0yLjE3IDIuMTd2My4yem0wLTE0LjE1YzAgMS4yLjk3IDIuMTcgMi4xNyAyLjE3czIuMTctLjk3IDIuMTctMi4xN1YzOS4yMWMwLTEuMi0uOTctMi4xNy0yLjE3LTIuMTdzLTIuMTcuOTctMi4xNyAyLjE3djQwLjY1elxcXCIgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRXYXJuaW5nNC1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRXYXJuaW5nNC1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpXFxcIiBmaWxsPVxcXCJpbmhlcml0XFxcIiBkYXRhLWFuaW1hdG9yLWdyb3VwPVxcXCJ0cnVlXFxcIiBkYXRhLWFuaW1hdG9yLXR5cGU9XFxcIjJcXFwiLz48L2c+PC9zdmc+XCI7cmV0dXJuIGl9LEw9ZnVuY3Rpb24odCxlKXt0fHwodD1cIjExMHB4XCIpLGV8fChlPVwiIzI2YzBkM1wiKTt2YXIgaT1cIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiBpZD1cXFwiTlhSZXBvcnRJbmZvXFxcIiB3aWR0aD1cXFwiXCIrdCtcIlxcXCIgaGVpZ2h0PVxcXCJcIit0K1wiXFxcIiBmaWxsPVxcXCJcIitlK1wiXFxcIiB2aWV3Qm94PVxcXCIwIDAgMTIwIDEyMFxcXCI+PHN0eWxlPkAtd2Via2l0LWtleWZyYW1lcyBOWFJlcG9ydEluZm80LWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NTAlLHRve29wYWNpdHk6MX19QGtleWZyYW1lcyBOWFJlcG9ydEluZm80LWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9NTAlLHRve29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0SW5mbzMtYW5pbWF0aW9uezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX01MCUsdG97LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC45NSwuOTUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9fUBrZXlmcmFtZXMgTlhSZXBvcnRJbmZvMy1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTUwJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX19QC13ZWJraXQta2V5ZnJhbWVzIE5YUmVwb3J0SW5mbzItYW5pbWF0aW9uezAle29wYWNpdHk6MH00MCUsdG97b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIE5YUmVwb3J0SW5mbzItYW5pbWF0aW9uezAle29wYWNpdHk6MH00MCUsdG97b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgTlhSZXBvcnRJbmZvMS1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKC41LC41KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTQwJSx0b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSgxLDEpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjk1LC45NSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KX19QGtleWZyYW1lcyBOWFJlcG9ydEluZm8xLWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguNSwuNSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoLjUsLjUpIHRyYW5zbGF0ZSgtNjBweCwtNjBweCl9NDAlLHRvey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfTYwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoNjBweCw2MHB4KSBzY2FsZSguOTUsLjk1KSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpfX0jTlhSZXBvcnRJbmZvICp7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MS4yczthbmltYXRpb24tZHVyYXRpb246MS4yczstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsMCwxLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsMCwxLDEpfTwvc3R5bGU+PGcgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRJbmZvMS1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6TlhSZXBvcnRJbmZvMS1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZSg2MHB4LDYwcHgpIHNjYWxlKDEsMSkgdHJhbnNsYXRlKC02MHB4LC02MHB4KVxcXCI+PHBhdGggZD1cXFwiTTYwIDExNS4zOEMyOS40NiAxMTUuMzggNC42MiA5MC41NCA0LjYyIDYwIDQuNjIgMjkuNDYgMjkuNDYgNC42MiA2MCA0LjYyYzMwLjU0IDAgNTUuMzggMjQuODQgNTUuMzggNTUuMzggMCAzMC41NC0yNC44NCA1NS4zOC01NS4zOCA1NS4zOHpNNjAgMEMyNi45MiAwIDAgMjYuOTIgMCA2MHMyNi45MiA2MCA2MCA2MCA2MC0yNi45MiA2MC02MFM5My4wOCAwIDYwIDB6XFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm8yLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm8yLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiIGZpbGw9XFxcImluaGVyaXRcXFwiIGRhdGEtYW5pbWF0b3ItZ3JvdXA9XFxcInRydWVcXFwiIGRhdGEtYW5pbWF0b3ItdHlwZT1cXFwiMlxcXCIvPjwvZz48ZyBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm8zLWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm8zLWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlKDYwcHgsNjBweCkgc2NhbGUoMSwxKSB0cmFuc2xhdGUoLTYwcHgsLTYwcHgpXFxcIj48cGF0aCBkPVxcXCJNNTcuNzUgNDMuODVjMC0xLjI0IDEuMDEtMi4yNSAyLjI1LTIuMjVzMi4yNSAxLjAxIDIuMjUgMi4yNXY0OC4xOGMwIDEuMjQtMS4wMSAyLjI1LTIuMjUgMi4yNXMtMi4yNS0xLjAxLTIuMjUtMi4yNVY0My44NXptMC0xNS44OGMwLTEuMjQgMS4wMS0yLjI1IDIuMjUtMi4yNXMyLjI1IDEuMDEgMi4yNSAyLjI1djMuMzJjMCAxLjI1LTEuMDEgMi4yNS0yLjI1IDIuMjVzLTIuMjUtMS0yLjI1LTIuMjV2LTMuMzJ6XFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm80LWFuaW1hdGlvbjthbmltYXRpb24tbmFtZTpOWFJlcG9ydEluZm80LWFuaW1hdGlvbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC40MiwwLC41OCwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSlcXFwiIGZpbGw9XFxcImluaGVyaXRcXFwiIGRhdGEtYW5pbWF0b3ItZ3JvdXA9XFxcInRydWVcXFwiIGRhdGEtYW5pbWF0b3ItdHlwZT1cXFwiMlxcXCIvPjwvZz48L3N2Zz5cIjtyZXR1cm4gaX0sVz1mdW5jdGlvbih0LGUpe3R8fCh0PVwiNjBweFwiKSxlfHwoZT1cIiMzMmM2ODJcIik7dmFyIGk9XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgc3Ryb2tlPVxcXCJcIitlK1wiXFxcIiB3aWR0aD1cXFwiXCIrdCtcIlxcXCIgaGVpZ2h0PVxcXCJcIit0K1wiXFxcIiB0cmFuc2Zvcm09XFxcInNjYWxlKC44KVxcXCIgdmlld0JveD1cXFwiMCAwIDM4IDM4XFxcIj48ZyBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIHN0cm9rZS13aWR0aD1cXFwiMlxcXCIgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoMSAxKVxcXCI+PGNpcmNsZSBjeD1cXFwiMThcXFwiIGN5PVxcXCIxOFxcXCIgcj1cXFwiMThcXFwiIHN0cm9rZS1vcGFjaXR5PVxcXCIuMjVcXFwiLz48cGF0aCBkPVxcXCJNMzYgMThjMC05Ljk0LTguMDYtMTgtMTgtMThcXFwiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XFxcInRyYW5zZm9ybVxcXCIgZHVyPVxcXCIxc1xcXCIgZnJvbT1cXFwiMCAxOCAxOFxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHRvPVxcXCIzNjAgMTggMThcXFwiIHR5cGU9XFxcInJvdGF0ZVxcXCIvPjwvcGF0aD48L2c+PC9zdmc+XCI7cmV0dXJuIGl9LEk9ZnVuY3Rpb24odCxlKXt0fHwodD1cIjYwcHhcIiksZXx8KGU9XCIjMzJjNjgyXCIpO3ZhciBpPVwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIGlkPVxcXCJOWExvYWRpbmdIb3VyZ2xhc3NcXFwiIGZpbGw9XFxcIlwiK2UrXCJcXFwiIHdpZHRoPVxcXCJcIit0K1wiXFxcIiBoZWlnaHQ9XFxcIlwiK3QrXCJcXFwiIHZpZXdCb3g9XFxcIjAgMCAyMDAgMjAwXFxcIj48c3R5bGU+QC13ZWJraXQta2V5ZnJhbWVzIE5YaG91cmdsYXNzNS1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSwxKTt0cmFuc2Zvcm06c2NhbGUoMSwxKX0xNi42NyV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSwuOCk7dHJhbnNmb3JtOnNjYWxlKDEsLjgpfTMzLjMzJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguODgsLjYpO3RyYW5zZm9ybTpzY2FsZSguODgsLjYpfTM3LjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44NSwuNTUpO3RyYW5zZm9ybTpzY2FsZSguODUsLjU1KX00MS42NyV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgsLjUpO3RyYW5zZm9ybTpzY2FsZSguOCwuNSl9NDUuODMley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC43NSwuNDUpO3RyYW5zZm9ybTpzY2FsZSguNzUsLjQ1KX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjcsLjQpO3RyYW5zZm9ybTpzY2FsZSguNywuNCl9NTQuMTcley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC42LC4zNSk7dHJhbnNmb3JtOnNjYWxlKC42LC4zNSl9NTguMzMley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC41LC4zKTt0cmFuc2Zvcm06c2NhbGUoLjUsLjMpfTgzLjMzJSx0b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMiwwKTt0cmFuc2Zvcm06c2NhbGUoLjIsMCl9fUBrZXlmcmFtZXMgTlhob3VyZ2xhc3M1LWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLDEpO3RyYW5zZm9ybTpzY2FsZSgxLDEpfTE2LjY3JXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLC44KTt0cmFuc2Zvcm06c2NhbGUoMSwuOCl9MzMuMzMley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44OCwuNik7dHJhbnNmb3JtOnNjYWxlKC44OCwuNil9MzcuNSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjg1LC41NSk7dHJhbnNmb3JtOnNjYWxlKC44NSwuNTUpfTQxLjY3JXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCwuNSk7dHJhbnNmb3JtOnNjYWxlKC44LC41KX00NS44MyV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjc1LC40NSk7dHJhbnNmb3JtOnNjYWxlKC43NSwuNDUpfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNywuNCk7dHJhbnNmb3JtOnNjYWxlKC43LC40KX01NC4xNyV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjYsLjM1KTt0cmFuc2Zvcm06c2NhbGUoLjYsLjM1KX01OC4zMyV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUsLjMpO3RyYW5zZm9ybTpzY2FsZSguNSwuMyl9ODMuMzMlLHRvey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4yLDApO3RyYW5zZm9ybTpzY2FsZSguMiwwKX19QC13ZWJraXQta2V5ZnJhbWVzIE5YaG91cmdsYXNzMy1hbmltYXRpb257MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSwuMDIpO3RyYW5zZm9ybTpzY2FsZSgxLC4wMil9NzkuMTclLHRvey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEsMSk7dHJhbnNmb3JtOnNjYWxlKDEsMSl9fUBrZXlmcmFtZXMgTlhob3VyZ2xhc3MzLWFuaW1hdGlvbnswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLC4wMik7dHJhbnNmb3JtOnNjYWxlKDEsLjAyKX03OS4xNyUsdG97LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSwxKTt0cmFuc2Zvcm06c2NhbGUoMSwxKX19QC13ZWJraXQta2V5ZnJhbWVzIE5YaG91cmdsYXNzMS1hbmltYXRpb257MCUsODMuMzMley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX19QGtleWZyYW1lcyBOWGhvdXJnbGFzczEtYW5pbWF0aW9uezAlLDgzLjMzJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9fSNOWExvYWRpbmdIb3VyZ2xhc3MgKnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjoxLjJzO2FuaW1hdGlvbi1kdXJhdGlvbjoxLjJzOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwwLDEsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwwLDEsMSl9PC9zdHlsZT48ZyBkYXRhLWFuaW1hdG9yLWdyb3VwPVxcXCJ0cnVlXFxcIiBkYXRhLWFuaW1hdG9yLXR5cGU9XFxcIjFcXFwiIHN0eWxlPVxcXCItd2Via2l0LWFuaW1hdGlvbi1uYW1lOk5YaG91cmdsYXNzMS1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6Tlhob3VyZ2xhc3MxLWFuaW1hdGlvbjstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDUwJTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSA1MCU7dHJhbnNmb3JtLWJveDpmaWxsLWJveFxcXCI+PGcgaWQ9XFxcIk5YaG91cmdsYXNzMlxcXCIgZmlsbD1cXFwiaW5oZXJpdFxcXCI+PGcgZGF0YS1hbmltYXRvci1ncm91cD1cXFwidHJ1ZVxcXCIgZGF0YS1hbmltYXRvci10eXBlPVxcXCIyXFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb24tbmFtZTpOWGhvdXJnbGFzczMtYW5pbWF0aW9uO2FuaW1hdGlvbi1uYW1lOk5YaG91cmdsYXNzMy1hbmltYXRpb247LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNDIsMCwuNTgsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQyLDAsLjU4LDEpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo1MCUgMTAwJTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSAxMDAlO3RyYW5zZm9ybS1ib3g6ZmlsbC1ib3hcXFwiIG9wYWNpdHk9XFxcIi40XFxcIj48cGF0aCBpZD1cXFwiTlhob3VyZ2xhc3M0XFxcIiBkPVxcXCJNMTAwIDEwMGwtMzQuMzggMzIuMDh2MzEuMTRoNjguNzZ2LTMxLjE0elxcXCIvPjwvZz48ZyBkYXRhLWFuaW1hdG9yLWdyb3VwPVxcXCJ0cnVlXFxcIiBkYXRhLWFuaW1hdG9yLXR5cGU9XFxcIjJcXFwiIHN0eWxlPVxcXCItd2Via2l0LWFuaW1hdGlvbi1uYW1lOk5YaG91cmdsYXNzNS1hbmltYXRpb247YW5pbWF0aW9uLW5hbWU6Tlhob3VyZ2xhc3M1LWFuaW1hdGlvbjstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDEwMCU7dHJhbnNmb3JtLW9yaWdpbjo1MCUgMTAwJTt0cmFuc2Zvcm0tYm94OmZpbGwtYm94XFxcIiBvcGFjaXR5PVxcXCIuNFxcXCI+PHBhdGggaWQ9XFxcIk5YaG91cmdsYXNzNlxcXCIgZD1cXFwiTTEwMCAxMDBMNjUuNjIgNjcuOTJWMzYuNzhoNjguNzZ2MzEuMTR6XFxcIi8+PC9nPjxwYXRoIGQ9XFxcIk01MS4xNCAzOC44OWg4LjMzdjE0LjkzYzAgMTUuMSA4LjI5IDI4Ljk5IDIzLjM0IDM5LjEgMS44OCAxLjI1IDMuMDQgMy45NyAzLjA0IDcuMDhzLTEuMTYgNS44My0zLjA0IDcuMDljLTE1LjA1IDEwLjEtMjMuMzQgMjMuOTktMjMuMzQgMzkuMDl2MTQuOTNoLTguMzNhNC44NTkgNC44NTkgMCAxIDAgMCA5LjcyaDk3LjcyYTQuODU5IDQuODU5IDAgMSAwIDAtOS43MmgtOC4zM3YtMTQuOTNjMC0xNS4xLTguMjktMjguOTktMjMuMzQtMzkuMDktMS44OC0xLjI2LTMuMDQtMy45OC0zLjA0LTcuMDlzMS4xNi01LjgzIDMuMDQtNy4wOGMxNS4wNS0xMC4xMSAyMy4zNC0yNCAyMy4zNC0zOS4xVjM4Ljg5aDguMzNhNC44NTkgNC44NTkgMCAxIDAgMC05LjcySDUxLjE0YTQuODU5IDQuODU5IDAgMSAwIDAgOS43MnptNzkuNjcgMTQuOTNjMCAxNS44Ny0xMS45MyAyNi4yNS0xOS4wNCAzMS4wMy00LjYgMy4wOC03LjM0IDguNzUtNy4zNCAxNS4xNSAwIDYuNDEgMi43NCAxMi4wNyA3LjM0IDE1LjE1IDcuMTEgNC43OCAxOS4wNCAxNS4xNiAxOS4wNCAzMS4wM3YxNC45M0g2OS4xOXYtMTQuOTNjMC0xNS44NyAxMS45My0yNi4yNSAxOS4wNC0zMS4wMiA0LjYtMy4wOSA3LjM0LTguNzUgNy4zNC0xNS4xNiAwLTYuNC0yLjc0LTEyLjA3LTcuMzQtMTUuMTUtNy4xMS00Ljc4LTE5LjA0LTE1LjE2LTE5LjA0LTMxLjAzVjM4Ljg5aDYxLjYydjE0LjkzelxcXCIvPjwvZz48L2c+PC9zdmc+XCI7cmV0dXJuIGl9LFI9ZnVuY3Rpb24odCxlKXt0fHwodD1cIjYwcHhcIiksZXx8KGU9XCIjMzJjNjgyXCIpO3ZhciBpPVwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHdpZHRoPVxcXCJcIit0K1wiXFxcIiBoZWlnaHQ9XFxcIlwiK3QrXCJcXFwiIHZpZXdCb3g9XFxcIjI1IDI1IDUwIDUwXFxcIiBzdHlsZT1cXFwiLXdlYmtpdC1hbmltYXRpb246cm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246cm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTtoZWlnaHQ6XCIrdCtcIjstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGNlbnRlcjstbXMtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGNlbnRlcjt3aWR0aDpcIit0K1wiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46YXV0b1xcXCI+PHN0eWxlPkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGV7dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHJvdGF0ZXt0b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUAtd2Via2l0LWtleWZyYW1lcyBkYXNoezAle3N0cm9rZS1kYXNoYXJyYXk6MSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6MH01MCV7c3Ryb2tlLWRhc2hhcnJheTo4OSwyMDA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTM1fXRve3N0cm9rZS1kYXNoYXJyYXk6ODksMjAwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xMjR9fUBrZXlmcmFtZXMgZGFzaHswJXtzdHJva2UtZGFzaGFycmF5OjEsMjAwO3N0cm9rZS1kYXNob2Zmc2V0OjB9NTAle3N0cm9rZS1kYXNoYXJyYXk6ODksMjAwO3N0cm9rZS1kYXNob2Zmc2V0Oi0zNX10b3tzdHJva2UtZGFzaGFycmF5Ojg5LDIwMDtzdHJva2UtZGFzaG9mZnNldDotMTI0fX08L3N0eWxlPjxjaXJjbGUgY3g9XFxcIjUwXFxcIiBjeT1cXFwiNTBcXFwiIHI9XFxcIjIwXFxcIiBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIlwiK2UrXCJcXFwiIHN0cm9rZS13aWR0aD1cXFwiMlxcXCIgc3R5bGU9XFxcIi13ZWJraXQtYW5pbWF0aW9uOmRhc2ggMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZSxjb2xvciAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO2FuaW1hdGlvbjpkYXNoIDEuNXMgZWFzZS1pbi1vdXQgaW5maW5pdGUsY29sb3IgMS41cyBlYXNlLWluLW91dCBpbmZpbml0ZVxcXCIgc3Ryb2tlLWRhc2hhcnJheT1cXFwiMTUwIDIwMFxcXCIgc3Ryb2tlLWRhc2hvZmZzZXQ9XFxcIi0xMFxcXCIgc3Ryb2tlLWxpbmVjYXA9XFxcInJvdW5kXFxcIi8+PC9zdmc+XCI7cmV0dXJuIGl9LEE9ZnVuY3Rpb24odCxlKXt0fHwodD1cIjYwcHhcIiksZXx8KGU9XCIjMzJjNjgyXCIpO3ZhciBpPVwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIGZpbGw9XFxcIlwiK2UrXCJcXFwiIHdpZHRoPVxcXCJcIit0K1wiXFxcIiBoZWlnaHQ9XFxcIlwiK3QrXCJcXFwiIHZpZXdCb3g9XFxcIjAgMCAxMjggMTI4XFxcIj48Zz48cGF0aCBmaWxsPVxcXCJpbmhlcml0XFxcIiBkPVxcXCJNMTA5LjI1IDU1LjVoLTM2bDEyLTEyYTI5LjU0IDI5LjU0IDAgMCAwLTQ5LjUzIDEySDE4Ljc1QTQ2LjA0IDQ2LjA0IDAgMCAxIDk2LjkgMzEuODRsMTIuMzUtMTIuMzR2MzZ6bS05MC41IDE3aDM2bC0xMiAxMmEyOS41NCAyOS41NCAwIDAgMCA0OS41My0xMmgxNi45N0E0Ni4wNCA0Ni4wNCAwIDAgMSAzMS4xIDk2LjE2TDE4Ljc0IDEwOC41di0zNnpcXFwiLz48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPVxcXCJ0cmFuc2Zvcm1cXFwiIGR1cj1cXFwiMS41c1xcXCIgZnJvbT1cXFwiMCA2NCA2NFxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHRvPVxcXCIzNjAgNjQgNjRcXFwiIHR5cGU9XFxcInJvdGF0ZVxcXCIvPjwvZz48L3N2Zz5cIjtyZXR1cm4gaX0sTT1mdW5jdGlvbih0LGUpe3R8fCh0PVwiNjBweFwiKSxlfHwoZT1cIiMzMmM2ODJcIik7dmFyIGk9XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgZmlsbD1cXFwiXCIrZStcIlxcXCIgd2lkdGg9XFxcIlwiK3QrXCJcXFwiIGhlaWdodD1cXFwiXCIrdCtcIlxcXCIgdmlld0JveD1cXFwiMCAwIDEwMCAxMDBcXFwiPjxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKDI1IDUwKVxcXCI+PGNpcmNsZSByPVxcXCI5XFxcIiBmaWxsPVxcXCJpbmhlcml0XFxcIiB0cmFuc2Zvcm09XFxcInNjYWxlKC4yMzkpXFxcIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPVxcXCJ0cmFuc2Zvcm1cXFwiIGJlZ2luPVxcXCItMC4yNjZzXFxcIiBjYWxjTW9kZT1cXFwic3BsaW5lXFxcIiBkdXI9XFxcIjAuOHNcXFwiIGtleVNwbGluZXM9XFxcIjAuMyAwIDAuNyAxOzAuMyAwIDAuNyAxXFxcIiBrZXlUaW1lcz1cXFwiMDswLjU7MVxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHR5cGU9XFxcInNjYWxlXFxcIiB2YWx1ZXM9XFxcIjA7MTswXFxcIi8+PC9jaXJjbGU+PC9nPjxnIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKDUwIDUwKVxcXCI+PGNpcmNsZSByPVxcXCI5XFxcIiBmaWxsPVxcXCJpbmhlcml0XFxcIiB0cmFuc2Zvcm09XFxcInNjYWxlKC4wMDE1MilcXFwiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XFxcInRyYW5zZm9ybVxcXCIgYmVnaW49XFxcIi0wLjEzM3NcXFwiIGNhbGNNb2RlPVxcXCJzcGxpbmVcXFwiIGR1cj1cXFwiMC44c1xcXCIga2V5U3BsaW5lcz1cXFwiMC4zIDAgMC43IDE7MC4zIDAgMC43IDFcXFwiIGtleVRpbWVzPVxcXCIwOzAuNTsxXFxcIiByZXBlYXRDb3VudD1cXFwiaW5kZWZpbml0ZVxcXCIgdHlwZT1cXFwic2NhbGVcXFwiIHZhbHVlcz1cXFwiMDsxOzBcXFwiLz48L2NpcmNsZT48L2c+PGcgdHJhbnNmb3JtPVxcXCJ0cmFuc2xhdGUoNzUgNTApXFxcIj48Y2lyY2xlIHI9XFxcIjlcXFwiIGZpbGw9XFxcImluaGVyaXRcXFwiIHRyYW5zZm9ybT1cXFwic2NhbGUoLjI5OSlcXFwiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XFxcInRyYW5zZm9ybVxcXCIgYmVnaW49XFxcIjBzXFxcIiBjYWxjTW9kZT1cXFwic3BsaW5lXFxcIiBkdXI9XFxcIjAuOHNcXFwiIGtleVNwbGluZXM9XFxcIjAuMyAwIDAuNyAxOzAuMyAwIDAuNyAxXFxcIiBrZXlUaW1lcz1cXFwiMDswLjU7MVxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHR5cGU9XFxcInNjYWxlXFxcIiB2YWx1ZXM9XFxcIjA7MTswXFxcIi8+PC9jaXJjbGU+PC9nPjwvc3ZnPlwiO3JldHVybiBpfSxCPWZ1bmN0aW9uKHQsZSl7dHx8KHQ9XCI2MHB4XCIpLGV8fChlPVwiIzMyYzY4MlwiKTt2YXIgaT1cIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiBzdHJva2U9XFxcIlwiK2UrXCJcXFwiIHdpZHRoPVxcXCJcIit0K1wiXFxcIiBoZWlnaHQ9XFxcIlwiK3QrXCJcXFwiIHZpZXdCb3g9XFxcIjAgMCA0NCA0NFxcXCI+PGcgZmlsbD1cXFwibm9uZVxcXCIgZmlsbC1ydWxlPVxcXCJldmVub2RkXFxcIiBzdHJva2Utd2lkdGg9XFxcIjJcXFwiPjxjaXJjbGUgY3g9XFxcIjIyXFxcIiBjeT1cXFwiMjJcXFwiIHI9XFxcIjFcXFwiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9XFxcInJcXFwiIGJlZ2luPVxcXCIwc1xcXCIgY2FsY01vZGU9XFxcInNwbGluZVxcXCIgZHVyPVxcXCIxLjhzXFxcIiBrZXlTcGxpbmVzPVxcXCIwLjE2NSwgMC44NCwgMC40NCwgMVxcXCIga2V5VGltZXM9XFxcIjA7IDFcXFwiIHJlcGVhdENvdW50PVxcXCJpbmRlZmluaXRlXFxcIiB2YWx1ZXM9XFxcIjE7IDIwXFxcIi8+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT1cXFwic3Ryb2tlLW9wYWNpdHlcXFwiIGJlZ2luPVxcXCIwc1xcXCIgY2FsY01vZGU9XFxcInNwbGluZVxcXCIgZHVyPVxcXCIxLjhzXFxcIiBrZXlTcGxpbmVzPVxcXCIwLjMsIDAuNjEsIDAuMzU1LCAxXFxcIiBrZXlUaW1lcz1cXFwiMDsgMVxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHZhbHVlcz1cXFwiMTsgMFxcXCIvPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjIyXFxcIiBjeT1cXFwiMjJcXFwiIHI9XFxcIjFcXFwiPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9XFxcInJcXFwiIGJlZ2luPVxcXCItMC45c1xcXCIgY2FsY01vZGU9XFxcInNwbGluZVxcXCIgZHVyPVxcXCIxLjhzXFxcIiBrZXlTcGxpbmVzPVxcXCIwLjE2NSwgMC44NCwgMC40NCwgMVxcXCIga2V5VGltZXM9XFxcIjA7IDFcXFwiIHJlcGVhdENvdW50PVxcXCJpbmRlZmluaXRlXFxcIiB2YWx1ZXM9XFxcIjE7IDIwXFxcIi8+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT1cXFwic3Ryb2tlLW9wYWNpdHlcXFwiIGJlZ2luPVxcXCItMC45c1xcXCIgY2FsY01vZGU9XFxcInNwbGluZVxcXCIgZHVyPVxcXCIxLjhzXFxcIiBrZXlTcGxpbmVzPVxcXCIwLjMsIDAuNjEsIDAuMzU1LCAxXFxcIiBrZXlUaW1lcz1cXFwiMDsgMVxcXCIgcmVwZWF0Q291bnQ9XFxcImluZGVmaW5pdGVcXFwiIHZhbHVlcz1cXFwiMTsgMFxcXCIvPjwvY2lyY2xlPjwvZz48L3N2Zz5cIjtyZXR1cm4gaX0sWD1mdW5jdGlvbih0LGUsaSl7dHx8KHQ9XCI2MHB4XCIpLGV8fChlPVwiI2Y4ZjhmOFwiKSxpfHwoaT1cIiMzMmM2ODJcIik7dmFyIGE9XCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgaWQ9XFxcIk5YTG9hZGluZ05vdGlmbGl4TGliXFxcIiB3aWR0aD1cXFwiXCIrdCtcIlxcXCIgaGVpZ2h0PVxcXCJcIit0K1wiXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjAwIDIwMFxcXCI+PGRlZnM+PHN0eWxlPkBrZXlmcmFtZXMgbm90aWZsaXgtbnswJXtzdHJva2UtZGFzaG9mZnNldDoxMDAwfXRve3N0cm9rZS1kYXNob2Zmc2V0OjB9fUBrZXlmcmFtZXMgbm90aWZsaXgteHswJXtzdHJva2UtZGFzaG9mZnNldDoxMDAwfXRve3N0cm9rZS1kYXNob2Zmc2V0OjB9fUBrZXlmcmFtZXMgbm90aWZsaXgtZG90ezAlLHRve3N0cm9rZS13aWR0aDowfTUwJXtzdHJva2Utd2lkdGg6MTJ9fS5ueC1pY29uLWxpbmV7c3Ryb2tlOlwiK2UrXCI7c3Ryb2tlLXdpZHRoOjEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyMjtmaWxsOm5vbmV9PC9zdHlsZT48L2RlZnM+PHBhdGggZD1cXFwiTTQ3Ljk3IDEzNS4wNWE2LjUgNi41IDAgMSAxIDAgMTMgNi41IDYuNSAwIDAgMSAwLTEzelxcXCIgc3R5bGU9XFxcImFuaW1hdGlvbi1uYW1lOm5vdGlmbGl4LWRvdDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi1kdXJhdGlvbjoxLjI1czthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1kaXJlY3Rpb246bm9ybWFsXFxcIiBmaWxsPVxcXCJcIitpK1wiXFxcIiBzdHJva2U9XFxcIlwiK2krXCJcXFwiIHN0cm9rZS1saW5lY2FwPVxcXCJyb3VuZFxcXCIgc3Ryb2tlLWxpbmVqb2luPVxcXCJyb3VuZFxcXCIgc3Ryb2tlLW1pdGVybGltaXQ9XFxcIjIyXFxcIiBzdHJva2Utd2lkdGg9XFxcIjEyXFxcIi8+PHBhdGggY2xhc3M9XFxcIm54LWljb24tbGluZVxcXCIgZD1cXFwiTTEwLjE0IDE0NC43NlY4Ny41NWMwLTUuNjgtNC41NC00MS4zNiAzNy44My00MS4zNiA0Mi4zNiAwIDM3LjgyIDM1LjY4IDM3LjgyIDQxLjM2djU3LjIxXFxcIiBzdHlsZT1cXFwiYW5pbWF0aW9uLW5hbWU6bm90aWZsaXgtbjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcjthbmltYXRpb24tZHVyYXRpb246Mi41czthbmltYXRpb24tZGVsYXk6MHM7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24tZGlyZWN0aW9uOm5vcm1hbFxcXCIgc3Ryb2tlLWRhc2hhcnJheT1cXFwiNTAwXFxcIi8+PHBhdGggY2xhc3M9XFxcIm54LWljb24tbGluZVxcXCIgZD1cXFwiTTExNS4wNiAxNDQuNDljMjQuOTgtMzIuNjggNDkuOTYtNjUuMzUgNzQuOTQtOTguMDNNMTE0Ljg5IDQ2LjZjMjUuMDkgMzIuNTggNTAuMTkgNjUuMTcgNzUuMjkgOTcuNzVcXFwiIHN0eWxlPVxcXCJhbmltYXRpb24tbmFtZTpub3RpZmxpeC14O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246bGluZWFyO2FuaW1hdGlvbi1kdXJhdGlvbjoyLjVzO2FuaW1hdGlvbi1kZWxheTouMnM7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24tZGlyZWN0aW9uOm5vcm1hbFxcXCIgc3Ryb2tlLWRhc2hhcnJheT1cXFwiNTAwXFxcIi8+PC9zdmc+XCI7cmV0dXJuIGF9LEQ9ZnVuY3Rpb24oKXtyZXR1cm5cIltpZF49Tm90aWZsaXhOb3RpZnlXcmFwXXtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6NDAwMTtvcGFjaXR5OjE7cmlnaHQ6MTBweDt0b3A6MTBweDt3aWR0aDoyODBweDttYXgtd2lkdGg6OTYlOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXS5ueC1mbGV4LWNlbnRlci1jZW50ZXJ7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMjBweCk7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LXdyYXA6d3JhcDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luOmF1dG99W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdOjotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDowO2hlaWdodDowfVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdICp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fVtpZF49Tm90aWZsaXhOb3RpZnlPdmVybGF5XXstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuM3MgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzIGVhc2UtaW4tb3V0fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXZ7cG9pbnRlci1ldmVudHM6YWxsOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtmb250LWZhbWlseTpcXFwiUXVpY2tzYW5kXFxcIiwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxcXFwiU2Vnb2UgVUlcXFwiLFJvYm90byxcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLEFyaWFsLHNhbnMtc2VyaWY7d2lkdGg6MTAwJTtkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveDtkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWZsZXg7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDstd2Via2l0LWZsZXgtd3JhcDp3cmFwOy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LXdlYmtpdC1hbGlnbi1pdGVtczpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MCAwIDEwcHg7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojMWUxZTFlO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4IDEycHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXY6bGFzdC1jaGlsZHttYXJnaW46MH1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2Lm54LXdpdGgtY2FsbGJhY2t7Y3Vyc29yOnBvaW50ZXJ9W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWljb257cGFkZGluZzo4cHg7bWluLWhlaWdodDo1NnB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtcGF1c2Vke2N1cnNvcjphdXRvfVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtbm90aWZ5LWNsaWNrLXRvLWNsb3Nle2N1cnNvcjpwb2ludGVyfVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1jbG9zZS1idXR0b257cGFkZGluZzoxMHB4IDM2cHggMTBweCAxMnB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1pY29uLm54LXdpdGgtY2xvc2UtYnV0dG9ue3BhZGRpbmc6NnB4IDM2cHggNnB4IDZweH1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2PnNwYW4ubngtbWVzc2FnZXtjdXJzb3I6aW5oZXJpdDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1mYW1pbHk6aW5oZXJpdCFpbXBvcnRhbnQ7d29yZC1icmVhazpicmVhay1hbGw7d29yZC1icmVhazpicmVhay13b3JkfVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXY+c3Bhbi5ueC1jbG9zZS1idXR0b257Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuMnMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjphbGwgLjJzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YWxsIC4ycyBlYXNlLWluLW91dDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo4cHg7dG9wOjA7Ym90dG9tOjA7bWFyZ2luOmF1dG87Y29sb3I6aW5oZXJpdDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXY+c3Bhbi5ueC1jbG9zZS1idXR0b246aG92ZXJ7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2PnNwYW4ubngtY2xvc2UtYnV0dG9uPnN2Z3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O3JpZ2h0OjJweDt0b3A6MnB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXY+Lm54LW1lc3NhZ2UtaWNvbntwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O2ZvbnQtc2l6ZTozMHB4O2xpbmUtaGVpZ2h0OjQwcHg7dGV4dC1hbGlnbjpjZW50ZXI7bGVmdDo4cHg7dG9wOjA7Ym90dG9tOjA7bWFyZ2luOmF1dG87Ym9yZGVyLXJhZGl1czppbmhlcml0fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXY+Lm54LW1lc3NhZ2UtaWNvbi1mYS5ueC1tZXNzYWdlLWljb24tZmEtc2hhZG93e2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMCAzNHB4IHJnYmEoMCwwLDAsLjIpO2JveC1zaGFkb3c6aW5zZXQgMCAwIDM0cHggcmdiYSgwLDAsMCwuMik7dGV4dC1zaGFkb3c6MCAwIDEwcHggcmdiYSgwLDAsMCwuMyl9W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdj5zcGFuLm54LXdpdGgtaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpsZWZ0O3dpZHRoOmNhbGMoMTAwJSAtIDQwcHgpO21hcmdpbjowIDAgMCA0MHB4O3BhZGRpbmc6MCAwIDAgMTBweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC1ydGwtb24+Lm54LW1lc3NhZ2UtaWNvbntsZWZ0OmF1dG87cmlnaHQ6OHB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtcnRsLW9uPnNwYW4ubngtd2l0aC1pY29ue3BhZGRpbmc6MCAxMHB4IDAgMDttYXJnaW46MCA0MHB4IDAgMH1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2Lm54LXJ0bC1vbj5zcGFuLm54LWNsb3NlLWJ1dHRvbntyaWdodDphdXRvO2xlZnQ6OHB4fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1pY29uLm54LXdpdGgtY2xvc2UtYnV0dG9uLm54LXJ0bC1vbntwYWRkaW5nOjZweCA2cHggNnB4IDM2cHh9W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWNsb3NlLWJ1dHRvbi5ueC1ydGwtb257cGFkZGluZzoxMHB4IDEycHggMTBweCAzNnB4fVtpZF49Tm90aWZsaXhOb3RpZnlPdmVybGF5XS5ueC13aXRoLWFuaW1hdGlvbixbaWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2Lm54LXdpdGgtYW5pbWF0aW9uLm54LWZhZGV7LXdlYmtpdC1hbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOm5vdGlmeS1hbmltYXRpb24tZmFkZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBub3RpZnktYW5pbWF0aW9uLWZhZGV7MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG5vdGlmeS1hbmltYXRpb24tZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1hbmltYXRpb24ubngtem9vbXstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktYW5pbWF0aW9uLXpvb20gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi16b29tIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIG5vdGlmeS1hbmltYXRpb24tem9vbXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpO3RyYW5zZm9ybTpzY2FsZSgxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBub3RpZnktYW5pbWF0aW9uLXpvb217MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KTt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1hbmltYXRpb24ubngtZnJvbS1yaWdodHstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktYW5pbWF0aW9uLWZyb20tcmlnaHQgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi1mcm9tLXJpZ2h0IC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIG5vdGlmeS1hbmltYXRpb24tZnJvbS1yaWdodHswJXtyaWdodDotMzAwcHg7b3BhY2l0eTowfTUwJXtyaWdodDo4cHg7b3BhY2l0eToxfTEwMCV7cmlnaHQ6MDtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgbm90aWZ5LWFuaW1hdGlvbi1mcm9tLXJpZ2h0ezAle3JpZ2h0Oi0zMDBweDtvcGFjaXR5OjB9NTAle3JpZ2h0OjhweDtvcGFjaXR5OjF9MTAwJXtyaWdodDowO29wYWNpdHk6MX19W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWFuaW1hdGlvbi5ueC1mcm9tLWxlZnR7LXdlYmtpdC1hbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi1mcm9tLWxlZnQgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi1mcm9tLWxlZnQgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgbm90aWZ5LWFuaW1hdGlvbi1mcm9tLWxlZnR7MCV7bGVmdDotMzAwcHg7b3BhY2l0eTowfTUwJXtsZWZ0OjhweDtvcGFjaXR5OjF9MTAwJXtsZWZ0OjA7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG5vdGlmeS1hbmltYXRpb24tZnJvbS1sZWZ0ezAle2xlZnQ6LTMwMHB4O29wYWNpdHk6MH01MCV7bGVmdDo4cHg7b3BhY2l0eToxfTEwMCV7bGVmdDowO29wYWNpdHk6MX19W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWFuaW1hdGlvbi5ueC1mcm9tLXRvcHstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktYW5pbWF0aW9uLWZyb20tdG9wIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOm5vdGlmeS1hbmltYXRpb24tZnJvbS10b3AgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgbm90aWZ5LWFuaW1hdGlvbi1mcm9tLXRvcHswJXt0b3A6LTUwcHg7b3BhY2l0eTowfTUwJXt0b3A6OHB4O29wYWNpdHk6MX0xMDAle3RvcDowO29wYWNpdHk6MX19QGtleWZyYW1lcyBub3RpZnktYW5pbWF0aW9uLWZyb20tdG9wezAle3RvcDotNTBweDtvcGFjaXR5OjB9NTAle3RvcDo4cHg7b3BhY2l0eToxfTEwMCV7dG9wOjA7b3BhY2l0eToxfX1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2Lm54LXdpdGgtYW5pbWF0aW9uLm54LWZyb20tYm90dG9tey13ZWJraXQtYW5pbWF0aW9uOm5vdGlmeS1hbmltYXRpb24tZnJvbS1ib3R0b20gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bm90aWZ5LWFuaW1hdGlvbi1mcm9tLWJvdHRvbSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBub3RpZnktYW5pbWF0aW9uLWZyb20tYm90dG9tezAle2JvdHRvbTotNTBweDtvcGFjaXR5OjB9NTAle2JvdHRvbTo4cHg7b3BhY2l0eToxfTEwMCV7Ym90dG9tOjA7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG5vdGlmeS1hbmltYXRpb24tZnJvbS1ib3R0b217MCV7Ym90dG9tOi01MHB4O29wYWNpdHk6MH01MCV7Ym90dG9tOjhweDtvcGFjaXR5OjF9MTAwJXtib3R0b206MDtvcGFjaXR5OjF9fVtpZF49Tm90aWZsaXhOb3RpZnlPdmVybGF5XS5ueC13aXRoLWFuaW1hdGlvbi5ueC1yZW1vdmUsW2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWFuaW1hdGlvbi5ueC1mYWRlLm54LXJlbW92ZXtvcGFjaXR5OjA7LXdlYmtpdC1hbmltYXRpb246bm90aWZ5LXJlbW92ZS1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOm5vdGlmeS1yZW1vdmUtZmFkZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBub3RpZnktcmVtb3ZlLWZhZGV7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIG5vdGlmeS1yZW1vdmUtZmFkZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1hbmltYXRpb24ubngtem9vbS5ueC1yZW1vdmV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApOy13ZWJraXQtYW5pbWF0aW9uOm5vdGlmeS1yZW1vdmUtem9vbSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsO2FuaW1hdGlvbjpub3RpZnktcmVtb3ZlLXpvb20gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgbm90aWZ5LXJlbW92ZS16b29tezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfX1Aa2V5ZnJhbWVzIG5vdGlmeS1yZW1vdmUtem9vbXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpO3RyYW5zZm9ybTpzY2FsZSgxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWFuaW1hdGlvbi5ueC1mcm9tLXRvcC5ueC1yZW1vdmV7b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOm5vdGlmeS1yZW1vdmUtdG8tdG9wIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOm5vdGlmeS1yZW1vdmUtdG8tdG9wIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIG5vdGlmeS1yZW1vdmUtdG8tdG9wezAle3RvcDowO29wYWNpdHk6MX01MCV7dG9wOjhweDtvcGFjaXR5OjF9MTAwJXt0b3A6LTUwcHg7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIG5vdGlmeS1yZW1vdmUtdG8tdG9wezAle3RvcDowO29wYWNpdHk6MX01MCV7dG9wOjhweDtvcGFjaXR5OjF9MTAwJXt0b3A6LTUwcHg7b3BhY2l0eTowfX1baWRePU5vdGlmbGl4Tm90aWZ5V3JhcF0+ZGl2Lm54LXdpdGgtYW5pbWF0aW9uLm54LWZyb20tcmlnaHQubngtcmVtb3Zle29wYWNpdHk6MDstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktcmVtb3ZlLXRvLXJpZ2h0IC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOm5vdGlmeS1yZW1vdmUtdG8tcmlnaHQgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgbm90aWZ5LXJlbW92ZS10by1yaWdodHswJXtyaWdodDowO29wYWNpdHk6MX01MCV7cmlnaHQ6OHB4O29wYWNpdHk6MX0xMDAle3JpZ2h0Oi0zMDBweDtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgbm90aWZ5LXJlbW92ZS10by1yaWdodHswJXtyaWdodDowO29wYWNpdHk6MX01MCV7cmlnaHQ6OHB4O29wYWNpdHk6MX0xMDAle3JpZ2h0Oi0zMDBweDtvcGFjaXR5OjB9fVtpZF49Tm90aWZsaXhOb3RpZnlXcmFwXT5kaXYubngtd2l0aC1hbmltYXRpb24ubngtZnJvbS1ib3R0b20ubngtcmVtb3Zle29wYWNpdHk6MDstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktcmVtb3ZlLXRvLWJvdHRvbSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsO2FuaW1hdGlvbjpub3RpZnktcmVtb3ZlLXRvLWJvdHRvbSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBub3RpZnktcmVtb3ZlLXRvLWJvdHRvbXswJXtib3R0b206MDtvcGFjaXR5OjF9NTAle2JvdHRvbTo4cHg7b3BhY2l0eToxfTEwMCV7Ym90dG9tOi01MHB4O29wYWNpdHk6MH19QGtleWZyYW1lcyBub3RpZnktcmVtb3ZlLXRvLWJvdHRvbXswJXtib3R0b206MDtvcGFjaXR5OjF9NTAle2JvdHRvbTo4cHg7b3BhY2l0eToxfTEwMCV7Ym90dG9tOi01MHB4O29wYWNpdHk6MH19W2lkXj1Ob3RpZmxpeE5vdGlmeVdyYXBdPmRpdi5ueC13aXRoLWFuaW1hdGlvbi5ueC1mcm9tLWxlZnQubngtcmVtb3Zle29wYWNpdHk6MDstd2Via2l0LWFuaW1hdGlvbjpub3RpZnktcmVtb3ZlLXRvLWxlZnQgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bm90aWZ5LXJlbW92ZS10by1sZWZ0IC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIG5vdGlmeS1yZW1vdmUtdG8tbGVmdHswJXtsZWZ0OjA7b3BhY2l0eToxfTUwJXtsZWZ0OjhweDtvcGFjaXR5OjF9MTAwJXtsZWZ0Oi0zMDBweDtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgbm90aWZ5LXJlbW92ZS10by1sZWZ0ezAle2xlZnQ6MDtvcGFjaXR5OjF9NTAle2xlZnQ6OHB4O29wYWNpdHk6MX0xMDAle2xlZnQ6LTMwMHB4O29wYWNpdHk6MH19XCJ9LFQ9MCxGPWZ1bmN0aW9uKGEsbixvLHIpe2lmKCF3KFwiYm9keVwiKSlyZXR1cm4hMTtlfHxHLk5vdGlmeS5pbml0KHt9KTt2YXIgYz12KCEwLGUse30pO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBvJiYhQXJyYXkuaXNBcnJheShvKXx8XCJvYmplY3RcIj09dHlwZW9mIHImJiFBcnJheS5pc0FycmF5KHIpKXt2YXIgcD17fTtcIm9iamVjdFwiPT10eXBlb2Ygbz9wPW86XCJvYmplY3RcIj09dHlwZW9mIHImJihwPXIpLGU9dighMCxlLHApfXZhciBmPWVbYS50b0xvY2FsZUxvd2VyQ2FzZShcImVuXCIpXTtUKyssXCJzdHJpbmdcIiE9dHlwZW9mIG4mJihuPVwiTm90aWZsaXggXCIrYSksZS5wbGFpblRleHQmJihuPU4obikpLCFlLnBsYWluVGV4dCYmbi5sZW5ndGg+ZS5tZXNzYWdlTWF4TGVuZ3RoJiYoZT12KCEwLGUse2Nsb3NlQnV0dG9uOiEwLG1lc3NhZ2VNYXhMZW5ndGg6MTUwfSksbj1cIlBvc3NpYmxlIEhUTUwgVGFncyBFcnJvcjogVGhlIFxcXCJwbGFpblRleHRcXFwiIG9wdGlvbiBpcyBcXFwiZmFsc2VcXFwiIGFuZCB0aGUgbm90aWZpY2F0aW9uIGNvbnRlbnQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0aGUgXFxcIm1lc3NhZ2VNYXhMZW5ndGhcXFwiIG9wdGlvbi5cIiksbi5sZW5ndGg+ZS5tZXNzYWdlTWF4TGVuZ3RoJiYobj1uLnN1YnN0cmluZygwLGUubWVzc2FnZU1heExlbmd0aCkrXCIuLi5cIiksXCJzaGFkb3dcIj09PWUuZm9udEF3ZXNvbWVJY29uU3R5bGUmJihmLmZvbnRBd2Vzb21lSWNvbkNvbG9yPWYuYmFja2dyb3VuZCksZS5jc3NBbmltYXRpb258fChlLmNzc0FuaW1hdGlvbkR1cmF0aW9uPTApO3ZhciBkPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS53cmFwSUQpfHx0LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aWYoZC5pZD1tLndyYXBJRCxkLnN0eWxlLndpZHRoPWUud2lkdGgsZC5zdHlsZS56SW5kZXg9ZS56aW5kZXgsZC5zdHlsZS5vcGFjaXR5PWUub3BhY2l0eSxcImNlbnRlci1jZW50ZXJcIj09PWUucG9zaXRpb24/KGQuc3R5bGUubGVmdD1lLmRpc3RhbmNlLGQuc3R5bGUudG9wPWUuZGlzdGFuY2UsZC5zdHlsZS5yaWdodD1lLmRpc3RhbmNlLGQuc3R5bGUuYm90dG9tPWUuZGlzdGFuY2UsZC5zdHlsZS5tYXJnaW49XCJhdXRvXCIsZC5jbGFzc0xpc3QuYWRkKFwibngtZmxleC1jZW50ZXItY2VudGVyXCIpLGQuc3R5bGUubWF4SGVpZ2h0PVwiY2FsYygoMTAwdmggLSBcIitlLmRpc3RhbmNlK1wiKSAtIFwiK2UuZGlzdGFuY2UrXCIpXCIsZC5zdHlsZS5kaXNwbGF5PVwiZmxleFwiLGQuc3R5bGUuZmxleFdyYXA9XCJ3cmFwXCIsZC5zdHlsZS5mbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIsZC5zdHlsZS5qdXN0aWZ5Q29udGVudD1cImNlbnRlclwiLGQuc3R5bGUuYWxpZ25JdGVtcz1cImNlbnRlclwiLGQuc3R5bGUucG9pbnRlckV2ZW50cz1cIm5vbmVcIik6XCJjZW50ZXItdG9wXCI9PT1lLnBvc2l0aW9uPyhkLnN0eWxlLmxlZnQ9ZS5kaXN0YW5jZSxkLnN0eWxlLnJpZ2h0PWUuZGlzdGFuY2UsZC5zdHlsZS50b3A9ZS5kaXN0YW5jZSxkLnN0eWxlLmJvdHRvbT1cImF1dG9cIixkLnN0eWxlLm1hcmdpbj1cImF1dG9cIik6XCJjZW50ZXItYm90dG9tXCI9PT1lLnBvc2l0aW9uPyhkLnN0eWxlLmxlZnQ9ZS5kaXN0YW5jZSxkLnN0eWxlLnJpZ2h0PWUuZGlzdGFuY2UsZC5zdHlsZS5ib3R0b209ZS5kaXN0YW5jZSxkLnN0eWxlLnRvcD1cImF1dG9cIixkLnN0eWxlLm1hcmdpbj1cImF1dG9cIik6XCJyaWdodC1ib3R0b21cIj09PWUucG9zaXRpb24/KGQuc3R5bGUucmlnaHQ9ZS5kaXN0YW5jZSxkLnN0eWxlLmJvdHRvbT1lLmRpc3RhbmNlLGQuc3R5bGUudG9wPVwiYXV0b1wiLGQuc3R5bGUubGVmdD1cImF1dG9cIik6XCJsZWZ0LXRvcFwiPT09ZS5wb3NpdGlvbj8oZC5zdHlsZS5sZWZ0PWUuZGlzdGFuY2UsZC5zdHlsZS50b3A9ZS5kaXN0YW5jZSxkLnN0eWxlLnJpZ2h0PVwiYXV0b1wiLGQuc3R5bGUuYm90dG9tPVwiYXV0b1wiKTpcImxlZnQtYm90dG9tXCI9PT1lLnBvc2l0aW9uPyhkLnN0eWxlLmxlZnQ9ZS5kaXN0YW5jZSxkLnN0eWxlLmJvdHRvbT1lLmRpc3RhbmNlLGQuc3R5bGUudG9wPVwiYXV0b1wiLGQuc3R5bGUucmlnaHQ9XCJhdXRvXCIpOihkLnN0eWxlLnJpZ2h0PWUuZGlzdGFuY2UsZC5zdHlsZS50b3A9ZS5kaXN0YW5jZSxkLnN0eWxlLmxlZnQ9XCJhdXRvXCIsZC5zdHlsZS5ib3R0b209XCJhdXRvXCIpLGUuYmFja092ZXJsYXkpe3ZhciB4PXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS5vdmVybGF5SUQpfHx0LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7eC5pZD1tLm92ZXJsYXlJRCx4LnN0eWxlLndpZHRoPVwiMTAwJVwiLHguc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHguc3R5bGUucG9zaXRpb249XCJmaXhlZFwiLHguc3R5bGUuekluZGV4PWUuemluZGV4LTEseC5zdHlsZS5sZWZ0PTAseC5zdHlsZS50b3A9MCx4LnN0eWxlLnJpZ2h0PTAseC5zdHlsZS5ib3R0b209MCx4LnN0eWxlLmJhY2tncm91bmQ9Zi5iYWNrT3ZlcmxheUNvbG9yfHxlLmJhY2tPdmVybGF5Q29sb3IseC5jbGFzc05hbWU9ZS5jc3NBbmltYXRpb24/XCJueC13aXRoLWFuaW1hdGlvblwiOlwiXCIseC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbj1lLmNzc0FuaW1hdGlvbj9lLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXNcIjpcIlwiLHQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS5vdmVybGF5SUQpfHx0LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoeCl9dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChtLndyYXBJRCl8fHQuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTt2YXIgZz10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zy5pZD1lLklEK1wiLVwiK1QsZy5jbGFzc05hbWU9ZS5jbGFzc05hbWUrXCIgXCIrZi5jaGlsZENsYXNzTmFtZStcIiBcIisoZS5jc3NBbmltYXRpb24/XCJueC13aXRoLWFuaW1hdGlvblwiOlwiXCIpK1wiIFwiKyhlLnVzZUljb24/XCJueC13aXRoLWljb25cIjpcIlwiKStcIiBueC1cIitlLmNzc0FuaW1hdGlvblN0eWxlK1wiIFwiKyhlLmNsb3NlQnV0dG9uJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBvP1wibngtd2l0aC1jbG9zZS1idXR0b25cIjpcIlwiKStcIiBcIisoXCJmdW5jdGlvblwiPT10eXBlb2Ygbz9cIm54LXdpdGgtY2FsbGJhY2tcIjpcIlwiKStcIiBcIisoZS5jbGlja1RvQ2xvc2U/XCJueC1ub3RpZnktY2xpY2stdG8tY2xvc2VcIjpcIlwiKSxnLnN0eWxlLmZvbnRTaXplPWUuZm9udFNpemUsZy5zdHlsZS5jb2xvcj1mLnRleHRDb2xvcixnLnN0eWxlLmJhY2tncm91bmQ9Zi5iYWNrZ3JvdW5kLGcuc3R5bGUuYm9yZGVyUmFkaXVzPWUuYm9yZGVyUmFkaXVzLGcuc3R5bGUucG9pbnRlckV2ZW50cz1cImFsbFwiLGUucnRsJiYoZy5zZXRBdHRyaWJ1dGUoXCJkaXJcIixcInJ0bFwiKSxnLmNsYXNzTGlzdC5hZGQoXCJueC1ydGwtb25cIikpLGcuc3R5bGUuZm9udEZhbWlseT1cIlxcXCJcIitlLmZvbnRGYW1pbHkrXCJcXFwiLCBcIitzLGUuY3NzQW5pbWF0aW9uJiYoZy5zdHlsZS5hbmltYXRpb25EdXJhdGlvbj1lLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXNcIik7dmFyIGI9XCJcIjtpZihlLmNsb3NlQnV0dG9uJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBvJiYoYj1cIjxzcGFuIGNsYXNzPVxcXCJueC1jbG9zZS1idXR0b25cXFwiPjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMjBcXFwiIGhlaWdodD1cXFwiMjBcXFwiIHZpZXdCb3g9XFxcIjAgMCAyMCAyMFxcXCI+PGc+PHBhdGggZmlsbD1cXFwiXCIrZi5ub3RpZmxpeEljb25Db2xvcitcIlxcXCIgZD1cXFwiTTAuMzggMi4xOWw3LjggNy44MSAtNy44IDcuODFjLTAuNTEsMC41IC0wLjUxLDEuMzEgLTAuMDEsMS44MSAwLjI1LDAuMjUgMC41NywwLjM4IDAuOTEsMC4zOCAwLjM0LDAgMC42NywtMC4xNCAwLjkxLC0wLjM4bDcuODEgLTcuODEgNy44MSA3LjgxYzAuMjQsMC4yNCAwLjU3LDAuMzggMC45MSwwLjM4IDAuMzQsMCAwLjY2LC0wLjE0IDAuOSwtMC4zOCAwLjUxLC0wLjUgMC41MSwtMS4zMSAwLC0xLjgxbC03LjgxIC03LjgxIDcuODEgLTcuODFjMC41MSwtMC41IDAuNTEsLTEuMzEgMCwtMS44MiAtMC41LC0wLjUgLTEuMzEsLTAuNSAtMS44MSwwbC03LjgxIDcuODEgLTcuODEgLTcuODFjLTAuNSwtMC41IC0xLjMxLC0wLjUgLTEuODEsMCAtMC41MSwwLjUxIC0wLjUxLDEuMzIgMCwxLjgyelxcXCIvPjwvZz48L3N2Zz48L3NwYW4+XCIpLCFlLnVzZUljb24pZy5pbm5lckhUTUw9XCI8c3BhbiBjbGFzcz1cXFwibngtbWVzc2FnZVxcXCI+XCIrbitcIjwvc3Bhbj5cIisoZS5jbG9zZUJ1dHRvbj9iOlwiXCIpO2Vsc2UgaWYoZS51c2VGb250QXdlc29tZSlnLmlubmVySFRNTD1cIjxpIHN0eWxlPVxcXCJjb2xvcjpcIitmLmZvbnRBd2Vzb21lSWNvbkNvbG9yK1wiOyBmb250LXNpemU6XCIrZS5mb250QXdlc29tZUljb25TaXplK1wiO1xcXCIgY2xhc3M9XFxcIm54LW1lc3NhZ2UtaWNvbiBueC1tZXNzYWdlLWljb24tZmEgXCIrZi5mb250QXdlc29tZUNsYXNzTmFtZStcIiBcIisoXCJzaGFkb3dcIj09PWUuZm9udEF3ZXNvbWVJY29uU3R5bGU/XCJueC1tZXNzYWdlLWljb24tZmEtc2hhZG93XCI6XCJueC1tZXNzYWdlLWljb24tZmEtYmFzaWNcIikrXCJcXFwiPjwvaT48c3BhbiBjbGFzcz1cXFwibngtbWVzc2FnZSBueC13aXRoLWljb25cXFwiPlwiK24rXCI8L3NwYW4+XCIrKGUuY2xvc2VCdXR0b24/YjpcIlwiKTtlbHNle3ZhciB1PVwiXCI7YT09PWwuU3VjY2Vzcz91PVwiPHN2ZyBjbGFzcz1cXFwibngtbWVzc2FnZS1pY29uXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHdpZHRoPVxcXCI0MFxcXCIgaGVpZ2h0PVxcXCI0MFxcXCIgdmlld0JveD1cXFwiMCAwIDQwIDQwXFxcIj48Zz48cGF0aCBmaWxsPVxcXCJcIitmLm5vdGlmbGl4SWNvbkNvbG9yK1wiXFxcIiBkPVxcXCJNMjAgMGMxMS4wMywwIDIwLDguOTcgMjAsMjAgMCwxMS4wMyAtOC45NywyMCAtMjAsMjAgLTExLjAzLDAgLTIwLC04Ljk3IC0yMCwtMjAgMCwtMTEuMDMgOC45NywtMjAgMjAsLTIwem0wIDM3Ljk4YzkuOTIsMCAxNy45OCwtOC4wNiAxNy45OCwtMTcuOTggMCwtOS45MiAtOC4wNiwtMTcuOTggLTE3Ljk4LC0xNy45OCAtOS45MiwwIC0xNy45OCw4LjA2IC0xNy45OCwxNy45OCAwLDkuOTIgOC4wNiwxNy45OCAxNy45OCwxNy45OHptLTIuNCAtMTMuMjlsMTEuNTIgLTEyLjk2YzAuMzcsLTAuNDEgMS4wMSwtMC40NSAxLjQyLC0wLjA4IDAuNDIsMC4zNyAwLjQ2LDEgMC4wOSwxLjQybC0xMi4xNiAxMy42N2MtMC4xOSwwLjIyIC0wLjQ2LDAuMzQgLTAuNzUsMC4zNCAtMC4yMywwIC0wLjQ1LC0wLjA3IC0wLjYzLC0wLjIybC03LjYgLTYuMDdjLTAuNDMsLTAuMzUgLTAuNSwtMC45OSAtMC4xNiwtMS40MiAwLjM1LC0wLjQzIDAuOTksLTAuNSAxLjQyLC0wLjE2bDYuODUgNS40OHpcXFwiLz48L2c+PC9zdmc+XCI6YT09PWwuRmFpbHVyZT91PVwiPHN2ZyBjbGFzcz1cXFwibngtbWVzc2FnZS1pY29uXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHdpZHRoPVxcXCI0MFxcXCIgaGVpZ2h0PVxcXCI0MFxcXCIgdmlld0JveD1cXFwiMCAwIDQwIDQwXFxcIj48Zz48cGF0aCBmaWxsPVxcXCJcIitmLm5vdGlmbGl4SWNvbkNvbG9yK1wiXFxcIiBkPVxcXCJNMjAgMGMxMS4wMywwIDIwLDguOTcgMjAsMjAgMCwxMS4wMyAtOC45NywyMCAtMjAsMjAgLTExLjAzLDAgLTIwLC04Ljk3IC0yMCwtMjAgMCwtMTEuMDMgOC45NywtMjAgMjAsLTIwem0wIDM3Ljk4YzkuOTIsMCAxNy45OCwtOC4wNiAxNy45OCwtMTcuOTggMCwtOS45MiAtOC4wNiwtMTcuOTggLTE3Ljk4LC0xNy45OCAtOS45MiwwIC0xNy45OCw4LjA2IC0xNy45OCwxNy45OCAwLDkuOTIgOC4wNiwxNy45OCAxNy45OCwxNy45OHptMS40MiAtMTcuOThsNi4xMyA2LjEyYzAuMzksMC40IDAuMzksMS4wNCAwLDEuNDMgLTAuMTksMC4xOSAtMC40NSwwLjI5IC0wLjcxLDAuMjkgLTAuMjcsMCAtMC41MywtMC4xIC0wLjcyLC0wLjI5bC02LjEyIC02LjEzIC02LjEzIDYuMTNjLTAuMTksMC4xOSAtMC40NCwwLjI5IC0wLjcxLDAuMjkgLTAuMjcsMCAtMC41MiwtMC4xIC0wLjcxLC0wLjI5IC0wLjM5LC0wLjM5IC0wLjM5LC0xLjAzIDAsLTEuNDNsNi4xMyAtNi4xMiAtNi4xMyAtNi4xM2MtMC4zOSwtMC4zOSAtMC4zOSwtMS4wMyAwLC0xLjQyIDAuMzksLTAuMzkgMS4wMywtMC4zOSAxLjQyLDBsNi4xMyA2LjEyIDYuMTIgLTYuMTJjMC40LC0wLjM5IDEuMDQsLTAuMzkgMS40MywwIDAuMzksMC4zOSAwLjM5LDEuMDMgMCwxLjQybC02LjEzIDYuMTN6XFxcIi8+PC9nPjwvc3ZnPlwiOmE9PT1sLldhcm5pbmc/dT1cIjxzdmcgY2xhc3M9XFxcIm54LW1lc3NhZ2UtaWNvblxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiNDBcXFwiIGhlaWdodD1cXFwiNDBcXFwiIHZpZXdCb3g9XFxcIjAgMCA0MCA0MFxcXCI+PGc+PHBhdGggZmlsbD1cXFwiXCIrZi5ub3RpZmxpeEljb25Db2xvcitcIlxcXCIgZD1cXFwiTTIxLjkxIDMuNDhsMTcuOCAzMC44OWMwLjg0LDEuNDYgLTAuMjMsMy4yNSAtMS45MSwzLjI1bC0zNS42IDBjLTEuNjgsMCAtMi43NSwtMS43OSAtMS45MSwtMy4yNWwxNy44IC0zMC44OWMwLjg1LC0xLjQ3IDIuOTcsLTEuNDcgMy44Miwwem0xNi4xNSAzMS44NGwtMTcuOCAtMzAuODljLTAuMTEsLTAuMiAtMC40MSwtMC4yIC0wLjUyLDBsLTE3LjggMzAuODljLTAuMTIsMC4yIDAuMDUsMC40IDAuMjYsMC40bDM1LjYgMGMwLjIxLDAgMC4zOCwtMC4yIDAuMjYsLTAuNHptLTE5LjAxIC00LjEybDAgLTEuMDVjMCwtMC41MyAwLjQyLC0wLjk1IDAuOTUsLTAuOTUgMC41MywwIDAuOTUsMC40MiAwLjk1LDAuOTVsMCAxLjA1YzAsMC41MyAtMC40MiwwLjk1IC0wLjk1LDAuOTUgLTAuNTMsMCAtMC45NSwtMC40MiAtMC45NSwtMC45NXptMCAtNC42NmwwIC0xMy4zOWMwLC0wLjUyIDAuNDIsLTAuOTUgMC45NSwtMC45NSAwLjUzLDAgMC45NSwwLjQzIDAuOTUsMC45NWwwIDEzLjM5YzAsMC41MyAtMC40MiwwLjk2IC0wLjk1LDAuOTYgLTAuNTMsMCAtMC45NSwtMC40MyAtMC45NSwtMC45NnpcXFwiLz48L2c+PC9zdmc+XCI6YT09PWwuSW5mbyYmKHU9XCI8c3ZnIGNsYXNzPVxcXCJueC1tZXNzYWdlLWljb25cXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgd2lkdGg9XFxcIjQwXFxcIiBoZWlnaHQ9XFxcIjQwXFxcIiB2aWV3Qm94PVxcXCIwIDAgNDAgNDBcXFwiPjxnPjxwYXRoIGZpbGw9XFxcIlwiK2Yubm90aWZsaXhJY29uQ29sb3IrXCJcXFwiIGQ9XFxcIk0yMCAwYzExLjAzLDAgMjAsOC45NyAyMCwyMCAwLDExLjAzIC04Ljk3LDIwIC0yMCwyMCAtMTEuMDMsMCAtMjAsLTguOTcgLTIwLC0yMCAwLC0xMS4wMyA4Ljk3LC0yMCAyMCwtMjB6bTAgMzcuOThjOS45MiwwIDE3Ljk4LC04LjA2IDE3Ljk4LC0xNy45OCAwLC05LjkyIC04LjA2LC0xNy45OCAtMTcuOTgsLTE3Ljk4IC05LjkyLDAgLTE3Ljk4LDguMDYgLTE3Ljk4LDE3Ljk4IDAsOS45MiA4LjA2LDE3Ljk4IDE3Ljk4LDE3Ljk4em0tMC45OSAtMjMuM2MwLC0wLjU0IDAuNDQsLTAuOTggMC45OSwtMC45OCAwLjU1LDAgMC45OSwwLjQ0IDAuOTksMC45OGwwIDE1Ljg2YzAsMC41NSAtMC40NCwwLjk5IC0wLjk5LDAuOTkgLTAuNTUsMCAtMC45OSwtMC40NCAtMC45OSwtMC45OWwwIC0xNS44NnptMCAtNS4yMmMwLC0wLjU1IDAuNDQsLTAuOTkgMC45OSwtMC45OSAwLjU1LDAgMC45OSwwLjQ0IDAuOTksMC45OWwwIDEuMDljMCwwLjU0IC0wLjQ0LDAuOTkgLTAuOTksMC45OSAtMC41NSwwIC0wLjk5LC0wLjQ1IC0wLjk5LC0wLjk5bDAgLTEuMDl6XFxcIi8+PC9nPjwvc3ZnPlwiKSxnLmlubmVySFRNTD11K1wiPHNwYW4gY2xhc3M9XFxcIm54LW1lc3NhZ2Ugbngtd2l0aC1pY29uXFxcIj5cIituK1wiPC9zcGFuPlwiKyhlLmNsb3NlQnV0dG9uP2I6XCJcIil9aWYoXCJsZWZ0LWJvdHRvbVwiPT09ZS5wb3NpdGlvbnx8XCJyaWdodC1ib3R0b21cIj09PWUucG9zaXRpb24pe3ZhciB5PXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS53cmFwSUQpO3kuaW5zZXJ0QmVmb3JlKGcseS5maXJzdENoaWxkKX1lbHNlIHQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS53cmFwSUQpLmFwcGVuZENoaWxkKGcpO3ZhciBrPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZy5pZCk7aWYoayl7dmFyIGgsQyx6PWZ1bmN0aW9uKCl7ay5jbGFzc0xpc3QuYWRkKFwibngtcmVtb3ZlXCIpO3ZhciBlPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS5vdmVybGF5SUQpO2UmJjA+PWQuY2hpbGRFbGVtZW50Q291bnQmJmUuY2xhc3NMaXN0LmFkZChcIm54LXJlbW92ZVwiKSxjbGVhclRpbWVvdXQoaCl9LFM9ZnVuY3Rpb24oKXtpZihrJiZudWxsIT09ay5wYXJlbnROb2RlJiZrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoayksMD49ZC5jaGlsZEVsZW1lbnRDb3VudCYmbnVsbCE9PWQucGFyZW50Tm9kZSl7ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3ZhciBlPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobS5vdmVybGF5SUQpO2UmJm51bGwhPT1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1jbGVhclRpbWVvdXQoQyl9O2lmKGUuY2xvc2VCdXR0b24mJlwiZnVuY3Rpb25cIiE9dHlwZW9mIG8pe3ZhciBMPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZy5pZCkucXVlcnlTZWxlY3RvcihcInNwYW4ubngtY2xvc2UtYnV0dG9uXCIpO0wuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsZnVuY3Rpb24oKXt6KCk7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe1MoKSxjbGVhclRpbWVvdXQodCl9LGUuY3NzQW5pbWF0aW9uRHVyYXRpb24pfSl9aWYoKFwiZnVuY3Rpb25cIj09dHlwZW9mIG98fGUuY2xpY2tUb0Nsb3NlKSYmay5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixmdW5jdGlvbigpe1wiZnVuY3Rpb25cIj09dHlwZW9mIG8mJm8oKSx6KCk7dmFyIHQ9c2V0VGltZW91dChmdW5jdGlvbigpe1MoKSxjbGVhclRpbWVvdXQodCl9LGUuY3NzQW5pbWF0aW9uRHVyYXRpb24pfSksIWUuY2xvc2VCdXR0b24mJlwiZnVuY3Rpb25cIiE9dHlwZW9mIG8pe3ZhciBXPWZ1bmN0aW9uKCl7aD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eigpfSxlLnRpbWVvdXQpLEM9c2V0VGltZW91dChmdW5jdGlvbigpe1MoKX0sZS50aW1lb3V0K2UuY3NzQW5pbWF0aW9uRHVyYXRpb24pfTtXKCksZS5wYXVzZU9uSG92ZXImJihrLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsZnVuY3Rpb24oKXtrLmNsYXNzTGlzdC5hZGQoXCJueC1wYXVzZWRcIiksY2xlYXJUaW1lb3V0KGgpLGNsZWFyVGltZW91dChDKX0pLGsuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIixmdW5jdGlvbigpe2suY2xhc3NMaXN0LnJlbW92ZShcIm54LXBhdXNlZFwiKSxXKCl9KSl9fWlmKGUuc2hvd09ubHlUaGVMYXN0T25lJiYwPFQpZm9yKHZhciBJLFI9dC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXj1cIitlLklEK1wiLV06bm90KFtpZD1cIitlLklEK1wiLVwiK1QrXCJdKVwiKSxBPTA7QTxSLmxlbmd0aDtBKyspST1SW0FdLG51bGwhPT1JLnBhcmVudE5vZGUmJkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChJKTtlPXYoITAsZSxjKX0sRT1mdW5jdGlvbigpe3JldHVyblwiW2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6NDAwMjt3aWR0aDoxMDAlO2hlaWdodDoxMDAlOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LWZhbWlseTpcXFwiUXVpY2tzYW5kXFxcIiwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxcXFwiU2Vnb2UgVUlcXFwiLFJvYm90byxcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLEFyaWFsLHNhbnMtc2VyaWY7bGVmdDowO3RvcDowO3BhZGRpbmc6MTBweDtjb2xvcjojMWUxZTFlO2JvcmRlci1yYWRpdXM6MjVweDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LXdyYXA6d3JhcDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdICp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fVtpZF49Tm90aWZsaXhSZXBvcnRXcmFwXT5kaXZbY2xhc3MqPVxcXCItb3ZlcmxheVxcXCJde3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bGVmdDowO3RvcDowO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuNSk7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDowfVtpZF49Tm90aWZsaXhSZXBvcnRXcmFwXT5kaXYubngtcmVwb3J0LWNsaWNrLXRvLWNsb3Nle2N1cnNvcjpwb2ludGVyfVtpZF49Tm90aWZsaXhSZXBvcnRXcmFwXT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJde3dpZHRoOjMyMHB4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6OTZ2aDtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87Ym9yZGVyLXJhZGl1czppbmhlcml0O3BhZGRpbmc6MTBweDstd2Via2l0LWZpbHRlcjpkcm9wLXNoYWRvdygwIDAgNXB4IHJnYmEoMCwwLDAsMC4wNSkpO2ZpbHRlcjpkcm9wLXNoYWRvdygwIDAgNXB4IHJnYmEoMCwgMCwgMCwgLjA1KSk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4wMyk7YmFja2dyb3VuZDojZjhmOGY4O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MX1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXTo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6MDtoZWlnaHQ6MH1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MkPVxcXCItaWNvblxcXCJdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt3aWR0aDoxMTBweDtoZWlnaHQ6MTEwcHg7ZGlzcGxheTpibG9jazttYXJnaW46NnB4IGF1dG8gMTJweH1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MkPVxcXCItaWNvblxcXCJdIHN2Z3ttaW4td2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6YXV0b31baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+Kj5oNXt3b3JkLWJyZWFrOmJyZWFrLWFsbDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Zm9udC1mYW1pbHk6aW5oZXJpdCFpbXBvcnRhbnQ7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6NTAwO2xpbmUtaGVpZ2h0OjEuNDttYXJnaW46MCAwIDEwcHg7cGFkZGluZzowIDAgMTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKTtmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXJ9W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdPio+cHt3b3JkLWJyZWFrOmJyZWFrLWFsbDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Zm9udC1mYW1pbHk6aW5oZXJpdCFpbXBvcnRhbnQ7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS40O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7cGFkZGluZzowIDEwcHg7bWFyZ2luOjAgMCAxMHB4fVtpZF49Tm90aWZsaXhSZXBvcnRXcmFwXSBhI05YUmVwb3J0QnV0dG9ue3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtYnJlYWs6YnJlYWstd29yZDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Zm9udC1mYW1pbHk6aW5oZXJpdCFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuMjVzIGVhc2UtaW4tb3V0Oy1vLXRyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjphbGwgLjI1cyBlYXNlLWluLW91dDtjdXJzb3I6cG9pbnRlcjtmbG9hdDpyaWdodDtwYWRkaW5nOjdweCAxN3B4O2JhY2tncm91bmQ6IzMyYzY4Mjtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjQ7Zm9udC13ZWlnaHQ6NTAwO2JvcmRlci1yYWRpdXM6aW5oZXJpdCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0gYSNOWFJlcG9ydEJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6aW5zZXQgMCAtNjBweCA1cHggLTVweCByZ2JhKDAsMCwwLC4yNSk7Ym94LXNoYWRvdzppbnNldCAwIC02MHB4IDVweCAtNXB4IHJnYmEoMCwwLDAsLjI1KX1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0ubngtcnRsLW9uIGEjTlhSZXBvcnRCdXR0b257ZmxvYXQ6bGVmdH1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0+ZGl2W2NsYXNzKj1cXFwiLW92ZXJsYXlcXFwiXS5ueC13aXRoLWFuaW1hdGlvbnstd2Via2l0LWFuaW1hdGlvbjpyZXBvcnQtb3ZlcmxheS1hbmltYXRpb24gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LW92ZXJsYXktYW5pbWF0aW9uIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIHJlcG9ydC1vdmVybGF5LWFuaW1hdGlvbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcmVwb3J0LW92ZXJsYXktYW5pbWF0aW9uezAle29wYWNpdHk6MH0xMDAle29wYWNpdHk6MX19W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0ubngtd2l0aC1hbmltYXRpb24ubngtZmFkZXstd2Via2l0LWFuaW1hdGlvbjpyZXBvcnQtYW5pbWF0aW9uLWZhZGUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIHJlcG9ydC1hbmltYXRpb24tZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcmVwb3J0LWFuaW1hdGlvbi1mYWRlezAle29wYWNpdHk6MH0xMDAle29wYWNpdHk6MX19W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0ubngtd2l0aC1hbmltYXRpb24ubngtem9vbXstd2Via2l0LWFuaW1hdGlvbjpyZXBvcnQtYW5pbWF0aW9uLXpvb20gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LWFuaW1hdGlvbi16b29tIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIHJlcG9ydC1hbmltYXRpb24tem9vbXswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9NTAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KTt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHJlcG9ydC1hbmltYXRpb24tem9vbXswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9NTAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KTt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1baWRePU5vdGlmbGl4UmVwb3J0V3JhcF0ubngtcmVtb3ZlPmRpdltjbGFzcyo9XFxcIi1vdmVybGF5XFxcIl0ubngtd2l0aC1hbmltYXRpb257b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOnJlcG9ydC1vdmVybGF5LWFuaW1hdGlvbi1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LW92ZXJsYXktYW5pbWF0aW9uLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyByZXBvcnQtb3ZlcmxheS1hbmltYXRpb24tcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyByZXBvcnQtb3ZlcmxheS1hbmltYXRpb24tcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdLm54LXJlbW92ZT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdLm54LXdpdGgtYW5pbWF0aW9uLm54LWZhZGV7b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOnJlcG9ydC1hbmltYXRpb24tZmFkZS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LWFuaW1hdGlvbi1mYWRlLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyByZXBvcnQtYW5pbWF0aW9uLWZhZGUtcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyByZXBvcnQtYW5pbWF0aW9uLWZhZGUtcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19W2lkXj1Ob3RpZmxpeFJlcG9ydFdyYXBdLm54LXJlbW92ZT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdLm54LXdpdGgtYW5pbWF0aW9uLm54LXpvb217b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOnJlcG9ydC1hbmltYXRpb24tem9vbS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246cmVwb3J0LWFuaW1hdGlvbi16b29tLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyByZXBvcnQtYW5pbWF0aW9uLXpvb20tcmVtb3ZlezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9NTAle29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19QGtleWZyYW1lcyByZXBvcnQtYW5pbWF0aW9uLXpvb20tcmVtb3ZlezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9NTAle29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19XCJ9LGo9ZnVuY3Rpb24oZSxhLG4sbyxyLGwpe2lmKCF3KFwiYm9keVwiKSlyZXR1cm4hMTtpfHxHLlJlcG9ydC5pbml0KHt9KTt2YXIgbT17fTtpZihcIm9iamVjdFwiPT10eXBlb2YgciYmIUFycmF5LmlzQXJyYXkocil8fFwib2JqZWN0XCI9PXR5cGVvZiBsJiYhQXJyYXkuaXNBcnJheShsKSl7dmFyIGY9e307XCJvYmplY3RcIj09dHlwZW9mIHI/Zj1yOlwib2JqZWN0XCI9PXR5cGVvZiBsJiYoZj1sKSxtPXYoITAsaSx7fSksaT12KCEwLGksZil9dmFyIGQ9aVtlLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW5cIildO1wic3RyaW5nXCIhPXR5cGVvZiBhJiYoYT1cIk5vdGlmbGl4IFwiK2UpLFwic3RyaW5nXCIhPXR5cGVvZiBuJiYoZT09PWMuU3VjY2Vzcz9uPVwiXFxcIkRvIG5vdCB0cnkgdG8gYmVjb21lIGEgcGVyc29uIG9mIHN1Y2Nlc3MgYnV0IHRyeSB0byBiZWNvbWUgYSBwZXJzb24gb2YgdmFsdWUuXFxcIiA8YnI+PGJyPi0gQWxiZXJ0IEVpbnN0ZWluXCI6ZT09PWMuRmFpbHVyZT9uPVwiXFxcIkZhaWx1cmUgaXMgc2ltcGx5IHRoZSBvcHBvcnR1bml0eSB0byBiZWdpbiBhZ2FpbiwgdGhpcyB0aW1lIG1vcmUgaW50ZWxsaWdlbnRseS5cXFwiIDxicj48YnI+LSBIZW5yeSBGb3JkXCI6ZT09PWMuV2FybmluZz9uPVwiXFxcIlRoZSBwZW9wbGVzIHdobyB3YW50IHRvIGxpdmUgY29tZm9ydGFibHkgd2l0aG91dCBwcm9kdWNpbmcgYW5kIGZhdGlndWU7IHRoZXkgYXJlIGRvb21lZCB0byBsb3NlIHRoZWlyIGRpZ25pdHksIHRoZW4gbGliZXJ0eSwgYW5kIHRoZW4gaW5kZXBlbmRlbmNlIGFuZCBkZXN0aW55LlxcXCIgPGJyPjxicj4tIE11c3RhZmEgS2VtYWwgQXRhdHVya1wiOmU9PT1jLkluZm8mJihuPVwiXFxcIktub3dsZWRnZSByZXN0cyBub3QgdXBvbiB0cnV0aCBhbG9uZSwgYnV0IHVwb24gZXJyb3IgYWxzby5cXFwiIDxicj48YnI+LSBDYXJsIEd1c3RhdiBKdW5nXCIpKSxcInN0cmluZ1wiIT10eXBlb2YgbyYmKG89XCJPa2F5XCIpLGkucGxhaW5UZXh0JiYoYT1OKGEpLG49TihuKSxvPU4obykpLGkucGxhaW5UZXh0fHwoYS5sZW5ndGg+aS50aXRsZU1heExlbmd0aCYmKGE9XCJQb3NzaWJsZSBIVE1MIFRhZ3MgRXJyb3JcIixuPVwiVGhlIFxcXCJwbGFpblRleHRcXFwiIG9wdGlvbiBpcyBcXFwiZmFsc2VcXFwiIGFuZCB0aGUgdGl0bGUgY29udGVudCBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZSBcXFwidGl0bGVNYXhMZW5ndGhcXFwiIG9wdGlvbi5cIixvPVwiT2theVwiKSxuLmxlbmd0aD5pLm1lc3NhZ2VNYXhMZW5ndGgmJihhPVwiUG9zc2libGUgSFRNTCBUYWdzIEVycm9yXCIsbj1cIlRoZSBcXFwicGxhaW5UZXh0XFxcIiBvcHRpb24gaXMgXFxcImZhbHNlXFxcIiBhbmQgdGhlIG1lc3NhZ2UgY29udGVudCBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZSBcXFwibWVzc2FnZU1heExlbmd0aFxcXCIgb3B0aW9uLlwiLG89XCJPa2F5XCIpLG8ubGVuZ3RoPmkuYnV0dG9uTWF4TGVuZ3RoJiYoYT1cIlBvc3NpYmxlIEhUTUwgVGFncyBFcnJvclwiLG49XCJUaGUgXFxcInBsYWluVGV4dFxcXCIgb3B0aW9uIGlzIFxcXCJmYWxzZVxcXCIgYW5kIHRoZSBidXR0b24gY29udGVudCBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZSBcXFwiYnV0dG9uTWF4TGVuZ3RoXFxcIiBvcHRpb24uXCIsbz1cIk9rYXlcIikpLGEubGVuZ3RoPmkudGl0bGVNYXhMZW5ndGgmJihhPWEuc3Vic3RyaW5nKDAsaS50aXRsZU1heExlbmd0aCkrXCIuLi5cIiksbi5sZW5ndGg+aS5tZXNzYWdlTWF4TGVuZ3RoJiYobj1uLnN1YnN0cmluZygwLGkubWVzc2FnZU1heExlbmd0aCkrXCIuLi5cIiksby5sZW5ndGg+aS5idXR0b25NYXhMZW5ndGgmJihvPW8uc3Vic3RyaW5nKDAsaS5idXR0b25NYXhMZW5ndGgpK1wiLi4uXCIpLGkuY3NzQW5pbWF0aW9ufHwoaS5jc3NBbmltYXRpb25EdXJhdGlvbj0wKTt2YXIgeD10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7eC5pZD1wLklELHguY2xhc3NOYW1lPWkuY2xhc3NOYW1lLHguc3R5bGUuekluZGV4PWkuemluZGV4LHguc3R5bGUuYm9yZGVyUmFkaXVzPWkuYm9yZGVyUmFkaXVzLHguc3R5bGUuZm9udEZhbWlseT1cIlxcXCJcIitpLmZvbnRGYW1pbHkrXCJcXFwiLCBcIitzLGkucnRsJiYoeC5zZXRBdHRyaWJ1dGUoXCJkaXJcIixcInJ0bFwiKSx4LmNsYXNzTGlzdC5hZGQoXCJueC1ydGwtb25cIikpLHguc3R5bGUuZGlzcGxheT1cImZsZXhcIix4LnN0eWxlLmZsZXhXcmFwPVwid3JhcFwiLHguc3R5bGUuZmxleERpcmVjdGlvbj1cImNvbHVtblwiLHguc3R5bGUuYWxpZ25JdGVtcz1cImNlbnRlclwiLHguc3R5bGUuanVzdGlmeUNvbnRlbnQ9XCJjZW50ZXJcIjt2YXIgZz1cIlwiLGI9ITA9PT1pLmJhY2tPdmVybGF5Q2xpY2tUb0Nsb3NlO2kuYmFja092ZXJsYXkmJihnPVwiPGRpdiBjbGFzcz1cXFwiXCIraS5jbGFzc05hbWUrXCItb3ZlcmxheVwiKyhpLmNzc0FuaW1hdGlvbj9cIiBueC13aXRoLWFuaW1hdGlvblwiOlwiXCIpKyhiP1wiIG54LXJlcG9ydC1jbGljay10by1jbG9zZVwiOlwiXCIpK1wiXFxcIiBzdHlsZT1cXFwiYmFja2dyb3VuZDpcIisoZC5iYWNrT3ZlcmxheUNvbG9yfHxpLmJhY2tPdmVybGF5Q29sb3IpK1wiO2FuaW1hdGlvbi1kdXJhdGlvbjpcIitpLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXM7XFxcIj48L2Rpdj5cIik7dmFyIHU9XCJcIjtpZihlPT09Yy5TdWNjZXNzP3U9QyhpLnN2Z1NpemUsZC5zdmdDb2xvcik6ZT09PWMuRmFpbHVyZT91PXooaS5zdmdTaXplLGQuc3ZnQ29sb3IpOmU9PT1jLldhcm5pbmc/dT1TKGkuc3ZnU2l6ZSxkLnN2Z0NvbG9yKTplPT09Yy5JbmZvJiYodT1MKGkuc3ZnU2l6ZSxkLnN2Z0NvbG9yKSkseC5pbm5lckhUTUw9ZytcIjxkaXYgY2xhc3M9XFxcIlwiK2kuY2xhc3NOYW1lK1wiLWNvbnRlbnRcIisoaS5jc3NBbmltYXRpb24/XCIgbngtd2l0aC1hbmltYXRpb24gXCI6XCJcIikrXCIgbngtXCIraS5jc3NBbmltYXRpb25TdHlsZStcIlxcXCIgc3R5bGU9XFxcIndpZHRoOlwiK2kud2lkdGgrXCI7IGJhY2tncm91bmQ6XCIraS5iYWNrZ3JvdW5kQ29sb3IrXCI7IGFuaW1hdGlvbi1kdXJhdGlvbjpcIitpLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXM7XFxcIj48ZGl2IHN0eWxlPVxcXCJ3aWR0aDpcIitpLnN2Z1NpemUrXCI7IGhlaWdodDpcIitpLnN2Z1NpemUrXCI7XFxcIiBjbGFzcz1cXFwiXCIraS5jbGFzc05hbWUrXCItaWNvblxcXCI+XCIrdStcIjwvZGl2PjxoNSBjbGFzcz1cXFwiXCIraS5jbGFzc05hbWUrXCItdGl0bGVcXFwiIHN0eWxlPVxcXCJmb250LXdlaWdodDo1MDA7IGZvbnQtc2l6ZTpcIitpLnRpdGxlRm9udFNpemUrXCI7IGNvbG9yOlwiK2QudGl0bGVDb2xvcitcIjtcXFwiPlwiK2ErXCI8L2g1PjxwIGNsYXNzPVxcXCJcIitpLmNsYXNzTmFtZStcIi1tZXNzYWdlXFxcIiBzdHlsZT1cXFwiZm9udC1zaXplOlwiK2kubWVzc2FnZUZvbnRTaXplK1wiOyBjb2xvcjpcIitkLm1lc3NhZ2VDb2xvcitcIjtcXFwiPlwiK24rXCI8L3A+PGEgaWQ9XFxcIk5YUmVwb3J0QnV0dG9uXFxcIiBjbGFzcz1cXFwiXCIraS5jbGFzc05hbWUrXCItYnV0dG9uXFxcIiBzdHlsZT1cXFwiZm9udC13ZWlnaHQ6NTAwOyBmb250LXNpemU6XCIraS5idXR0b25Gb250U2l6ZStcIjsgYmFja2dyb3VuZDpcIitkLmJ1dHRvbkJhY2tncm91bmQrXCI7IGNvbG9yOlwiK2QuYnV0dG9uQ29sb3IrXCI7XFxcIj5cIitvK1wiPC9hPjwvZGl2PlwiLCF0LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHguaWQpKXt0LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoeCk7dmFyIHk9ZnVuY3Rpb24oKXt2YXIgZT10LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHguaWQpO2UuY2xhc3NMaXN0LmFkZChcIm54LXJlbW92ZVwiKTt2YXIgYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bnVsbCE9PWUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGNsZWFyVGltZW91dChhKX0saS5jc3NBbmltYXRpb25EdXJhdGlvbil9LGs9dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIk5YUmVwb3J0QnV0dG9uXCIpO2lmKGsuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZyKCkseSgpfSksZyYmYil7dmFyIGg9dC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm54LXJlcG9ydC1jbGljay10by1jbG9zZVwiKTtoLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7eSgpfSl9fWk9dighMCxpLG0pfSxPPWZ1bmN0aW9uKCl7cmV0dXJuXCJbaWRePU5vdGlmbGl4Q29uZmlybVdyYXBde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6NDAwMzt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2xlZnQ6MDt0b3A6MDtwYWRkaW5nOjEwcHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Zm9udC1mYW1pbHk6XFxcIlF1aWNrc2FuZFxcXCIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsXFxcIlNlZ29lIFVJXFxcIixSb2JvdG8sXFxcIkhlbHZldGljYSBOZXVlXFxcIixBcmlhbCxzYW5zLXNlcmlmO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LXdyYXA6d3JhcDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXS5ueC1wb3NpdGlvbi1jZW50ZXItdG9wey13ZWJraXQtYm94LXBhY2s6c3RhcnQ7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDstbXMtZmxleC1wYWNrOnN0YXJ0O2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtcG9zaXRpb24tY2VudGVyLWJvdHRvbXstd2Via2l0LWJveC1wYWNrOmVuZDstd2Via2l0LWp1c3RpZnktY29udGVudDpmbGV4LWVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXS5ueC1wb3NpdGlvbi1sZWZ0LXRvcHstd2Via2l0LWJveC1hbGlnbjpzdGFydDstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtYWxpZ246c3RhcnQ7YWxpZ24taXRlbXM6ZmxleC1zdGFydDstd2Via2l0LWJveC1wYWNrOnN0YXJ0Oy13ZWJraXQtanVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXBvc2l0aW9uLWxlZnQtY2VudGVyey13ZWJraXQtYm94LWFsaWduOnN0YXJ0Oy13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1zdGFydDstbXMtZmxleC1hbGlnbjpzdGFydDthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtcG9zaXRpb24tbGVmdC1ib3R0b217LXdlYmtpdC1ib3gtYWxpZ246c3RhcnQ7LXdlYmtpdC1hbGlnbi1pdGVtczpmbGV4LXN0YXJ0Oy1tcy1mbGV4LWFsaWduOnN0YXJ0O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LXdlYmtpdC1ib3gtcGFjazplbmQ7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7LW1zLWZsZXgtcGFjazplbmQ7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtcG9zaXRpb24tcmlnaHQtdG9wey13ZWJraXQtYm94LWFsaWduOmVuZDstd2Via2l0LWFsaWduLWl0ZW1zOmZsZXgtZW5kOy1tcy1mbGV4LWFsaWduOmVuZDthbGlnbi1pdGVtczpmbGV4LWVuZDstd2Via2l0LWJveC1wYWNrOnN0YXJ0Oy13ZWJraXQtanVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXBvc2l0aW9uLXJpZ2h0LWNlbnRlcnstd2Via2l0LWJveC1hbGlnbjplbmQ7LXdlYmtpdC1hbGlnbi1pdGVtczpmbGV4LWVuZDstbXMtZmxleC1hbGlnbjplbmQ7YWxpZ24taXRlbXM6ZmxleC1lbmR9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXS5ueC1wb3NpdGlvbi1yaWdodC1ib3R0b217LXdlYmtpdC1ib3gtYWxpZ246ZW5kOy13ZWJraXQtYWxpZ24taXRlbXM6ZmxleC1lbmQ7LW1zLWZsZXgtYWxpZ246ZW5kO2FsaWduLWl0ZW1zOmZsZXgtZW5kOy13ZWJraXQtYm94LXBhY2s6ZW5kOy13ZWJraXQtanVzdGlmeS1jb250ZW50OmZsZXgtZW5kOy1tcy1mbGV4LXBhY2s6ZW5kO2p1c3RpZnktY29udGVudDpmbGV4LWVuZH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdICp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLW92ZXJsYXlcXFwiXXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2xlZnQ6MDt0b3A6MDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjUpO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1vdmVybGF5XFxcIl0ubngtd2l0aC1hbmltYXRpb257LXdlYmtpdC1hbmltYXRpb246Y29uZmlybS1vdmVybGF5LWFuaW1hdGlvbiAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsO2FuaW1hdGlvbjpjb25maXJtLW92ZXJsYXktYW5pbWF0aW9uIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIGNvbmZpcm0tb3ZlcmxheS1hbmltYXRpb257MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGNvbmZpcm0tb3ZlcmxheS1hbmltYXRpb257MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXJlbW92ZT5kaXZbY2xhc3MqPVxcXCItb3ZlcmxheVxcXCJdLm54LXdpdGgtYW5pbWF0aW9ue29wYWNpdHk6MDstd2Via2l0LWFuaW1hdGlvbjpjb25maXJtLW92ZXJsYXktYW5pbWF0aW9uLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsO2FuaW1hdGlvbjpjb25maXJtLW92ZXJsYXktYW5pbWF0aW9uLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBjb25maXJtLW92ZXJsYXktYW5pbWF0aW9uLXJlbW92ZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgY29uZmlybS1vdmVybGF5LWFuaW1hdGlvbi1yZW1vdmV7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl17d2lkdGg6MzAwcHg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDo5NnZoO292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bztib3JkZXItcmFkaXVzOjI1cHg7cGFkZGluZzoxMHB4O21hcmdpbjowOy13ZWJraXQtZmlsdGVyOmRyb3Atc2hhZG93KDAgMCA1cHggcmdiYSgwLDAsMCwwLjA1KSk7ZmlsdGVyOmRyb3Atc2hhZG93KDAgMCA1cHggcmdiYSgwLCAwLCAwLCAuMDUpKTtiYWNrZ3JvdW5kOiNmOGY4Zjg7Y29sb3I6IzFlMWUxZTtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7dGV4dC1hbGlnbjpjZW50ZXJ9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdOjotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDowO2hlaWdodDowfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl06Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdPmRpdltjbGFzcyo9XFxcIi1oZWFkXFxcIl17ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO3RleHQtYWxpZ246aW5oZXJpdH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWhlYWRcXFwiXT5oNXtmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7bWFyZ2luOjA7cGFkZGluZzowIDAgMTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKTtjb2xvcjojMzJjNjgyO2ZvbnQtZmFtaWx5OmluaGVyaXQhaW1wb3J0YW50O2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjEuNDtmb250LXdlaWdodDo1MDA7dGV4dC1hbGlnbjppbmhlcml0fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItaGVhZFxcXCJdPmRpdntmb250LWZhbWlseTppbmhlcml0IWltcG9ydGFudDttYXJnaW46MTVweCAwIDIwcHg7cGFkZGluZzowIDEwcHg7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNDtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6aW5oZXJpdDt0ZXh0LWFsaWduOmluaGVyaXR9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdPmRpdltjbGFzcyo9XFxcIi1oZWFkXFxcIl0+ZGl2PmRpdntmb250LWZhbWlseTppbmhlcml0IWltcG9ydGFudDtmbG9hdDpsZWZ0O3dpZHRoOjEwMCU7bWFyZ2luOjE1cHggMCAwO3BhZGRpbmc6MH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWhlYWRcXFwiXT5kaXY+ZGl2PmlucHV0e2ZvbnQtZmFtaWx5OmluaGVyaXQhaW1wb3J0YW50O2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJTtoZWlnaHQ6NDBweDttYXJnaW46MDtwYWRkaW5nOjAgMTVweDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEpO2JvcmRlci1yYWRpdXM6MjVweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6MTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjphbGwgLjI1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmFsbCAuMjVzIGVhc2UtaW4tb3V0O3RleHQtYWxpZ246bGVmdH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXJ0bC1vbj5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdPmRpdltjbGFzcyo9XFxcIi1oZWFkXFxcIl0+ZGl2PmRpdj5pbnB1dHt0ZXh0LWFsaWduOnJpZ2h0fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItaGVhZFxcXCJdPmRpdj5kaXY+aW5wdXQ6aG92ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItaGVhZFxcXCJdPmRpdj5kaXY+aW5wdXQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjMpfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItaGVhZFxcXCJdPmRpdj5kaXY+aW5wdXQubngtdmFsaWRhdGlvbi1mYWlsdXJle2JvcmRlci1jb2xvcjojZmY1NTQ5fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItaGVhZFxcXCJdPmRpdj5kaXY+aW5wdXQubngtdmFsaWRhdGlvbi1zdWNjZXNze2JvcmRlci1jb2xvcjojMzJjNjgyfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXT5kaXZbY2xhc3MqPVxcXCItYnV0dG9uc1xcXCJdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXQ7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO3RleHQtYWxpZ246aW5oZXJpdH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWJ1dHRvbnNcXFwiXT5he2N1cnNvcjpwb2ludGVyO2ZvbnQtZmFtaWx5OmluaGVyaXQhaW1wb3J0YW50Oy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjI1cyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOmFsbCAuMjVzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YWxsIC4yNXMgZWFzZS1pbi1vdXQ7ZmxvYXQ6bGVmdDt3aWR0aDo0OCU7cGFkZGluZzo5cHggNXB4O2JvcmRlci1yYWRpdXM6aW5oZXJpdCFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxNXB4O2xpbmUtaGVpZ2h0OjEuNDtjb2xvcjojZjhmOGY4O3RleHQtYWxpZ246aW5oZXJpdH1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWJ1dHRvbnNcXFwiXT5hLm54LWNvbmZpcm0tYnV0dG9uLW9re21hcmdpbjowIDIlIDAgMDtiYWNrZ3JvdW5kOiMzMmM2ODJ9W2lkXj1Ob3RpZmxpeENvbmZpcm1XcmFwXT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdPmRpdltjbGFzcyo9XFxcIi1idXR0b25zXFxcIl0+YS5ueC1jb25maXJtLWJ1dHRvbi1jYW5jZWx7bWFyZ2luOjAgMCAwIDIlO2JhY2tncm91bmQ6I2E5YTlhOX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWJ1dHRvbnNcXFwiXT5hLm54LWZ1bGx7bWFyZ2luOjA7d2lkdGg6MTAwJX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWJ1dHRvbnNcXFwiXT5hOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIC02MHB4IDVweCAtNXB4IHJnYmEoMCwwLDAsLjI1KTtib3gtc2hhZG93Omluc2V0IDAgLTYwcHggNXB4IC01cHggcmdiYSgwLDAsMCwuMjUpfVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtcnRsLW9uPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl0+ZGl2W2NsYXNzKj1cXFwiLWJ1dHRvbnNcXFwiXSxbaWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXJ0bC1vbj5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdPmRpdltjbGFzcyo9XFxcIi1idXR0b25zXFxcIl0+YXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGVZKDE4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZVkoMTgwZGVnKX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXdpdGgtYW5pbWF0aW9uLm54LWZhZGU+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXXstd2Via2l0LWFuaW1hdGlvbjpjb25maXJtLWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOmNvbmZpcm0tYW5pbWF0aW9uLWZhZGUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgY29uZmlybS1hbmltYXRpb24tZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgY29uZmlybS1hbmltYXRpb24tZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtd2l0aC1hbmltYXRpb24ubngtem9vbT5kaXZbY2xhc3MqPVxcXCItY29udGVudFxcXCJdey13ZWJraXQtYW5pbWF0aW9uOmNvbmZpcm0tYW5pbWF0aW9uLXpvb20gLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246Y29uZmlybS1hbmltYXRpb24tem9vbSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBjb25maXJtLWFuaW1hdGlvbi16b29tezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNSk7dHJhbnNmb3JtOnNjYWxlKC41KX01MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpO3RyYW5zZm9ybTpzY2FsZSgxLjA1KX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgY29uZmlybS1hbmltYXRpb24tem9vbXswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9NTAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KTt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1baWRePU5vdGlmbGl4Q29uZmlybVdyYXBdLm54LXdpdGgtYW5pbWF0aW9uLm54LWZhZGUubngtcmVtb3ZlPmRpdltjbGFzcyo9XFxcIi1jb250ZW50XFxcIl17b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOmNvbmZpcm0tYW5pbWF0aW9uLWZhZGUtcmVtb3ZlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOmNvbmZpcm0tYW5pbWF0aW9uLWZhZGUtcmVtb3ZlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIGNvbmZpcm0tYW5pbWF0aW9uLWZhZGUtcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyBjb25maXJtLWFuaW1hdGlvbi1mYWRlLXJlbW92ZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fVtpZF49Tm90aWZsaXhDb25maXJtV3JhcF0ubngtd2l0aC1hbmltYXRpb24ubngtem9vbS5ueC1yZW1vdmU+ZGl2W2NsYXNzKj1cXFwiLWNvbnRlbnRcXFwiXXtvcGFjaXR5OjA7LXdlYmtpdC1hbmltYXRpb246Y29uZmlybS1hbmltYXRpb24tem9vbS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246Y29uZmlybS1hbmltYXRpb24tem9vbS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgY29uZmlybS1hbmltYXRpb24tem9vbS1yZW1vdmV7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX01MCV7b3BhY2l0eTouNTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KTt0cmFuc2Zvcm06c2NhbGUoMS4wNSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfX1Aa2V5ZnJhbWVzIGNvbmZpcm0tYW5pbWF0aW9uLXpvb20tcmVtb3ZlezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9NTAle29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19XCJ9LEg9ZnVuY3Rpb24oZSxpLG4sbyxyLGwsbSxjLHApe2lmKCF3KFwiYm9keVwiKSlyZXR1cm4hMTthfHxHLkNvbmZpcm0uaW5pdCh7fSk7dmFyIHg9dighMCxhLHt9KTtcIm9iamVjdFwiIT10eXBlb2YgcHx8QXJyYXkuaXNBcnJheShwKXx8KGE9dighMCxhLHApKSxcInN0cmluZ1wiIT10eXBlb2YgaSYmKGk9XCJOb3RpZmxpeCBDb25maXJtXCIpLFwic3RyaW5nXCIhPXR5cGVvZiBuJiYobj1cIkRvIHlvdSBhZ3JlZSB3aXRoIG1lP1wiKSxcInN0cmluZ1wiIT10eXBlb2YgciYmKHI9XCJZZXNcIiksXCJzdHJpbmdcIiE9dHlwZW9mIGwmJihsPVwiTm9cIiksXCJmdW5jdGlvblwiIT10eXBlb2YgbSYmKG09dm9pZCAwKSxcImZ1bmN0aW9uXCIhPXR5cGVvZiBjJiYoYz12b2lkIDApLGEucGxhaW5UZXh0JiYoaT1OKGkpLG49TihuKSxyPU4ociksbD1OKGwpKSxhLnBsYWluVGV4dHx8KGkubGVuZ3RoPmEudGl0bGVNYXhMZW5ndGgmJihpPVwiUG9zc2libGUgSFRNTCBUYWdzIEVycm9yXCIsbj1cIlRoZSBcXFwicGxhaW5UZXh0XFxcIiBvcHRpb24gaXMgXFxcImZhbHNlXFxcIiBhbmQgdGhlIHRpdGxlIGNvbnRlbnQgbGVuZ3RoIGlzIG1vcmUgdGhhbiBcXFwidGl0bGVNYXhMZW5ndGhcXFwiIG9wdGlvbi5cIixyPVwiT2theVwiLGw9XCIuLi5cIiksbi5sZW5ndGg+YS5tZXNzYWdlTWF4TGVuZ3RoJiYoaT1cIlBvc3NpYmxlIEhUTUwgVGFncyBFcnJvclwiLG49XCJUaGUgXFxcInBsYWluVGV4dFxcXCIgb3B0aW9uIGlzIFxcXCJmYWxzZVxcXCIgYW5kIHRoZSBtZXNzYWdlIGNvbnRlbnQgbGVuZ3RoIGlzIG1vcmUgdGhhbiBcXFwibWVzc2FnZU1heExlbmd0aFxcXCIgb3B0aW9uLlwiLHI9XCJPa2F5XCIsbD1cIi4uLlwiKSwoci5sZW5ndGh8fGwubGVuZ3RoKT5hLmJ1dHRvbnNNYXhMZW5ndGgmJihpPVwiUG9zc2libGUgSFRNTCBUYWdzIEVycm9yXCIsbj1cIlRoZSBcXFwicGxhaW5UZXh0XFxcIiBvcHRpb24gaXMgXFxcImZhbHNlXFxcIiBhbmQgdGhlIGJ1dHRvbnMgY29udGVudCBsZW5ndGggaXMgbW9yZSB0aGFuIFxcXCJidXR0b25zTWF4TGVuZ3RoXFxcIiBvcHRpb24uXCIscj1cIk9rYXlcIixsPVwiLi4uXCIpKSxpLmxlbmd0aD5hLnRpdGxlTWF4TGVuZ3RoJiYoaT1pLnN1YnN0cmluZygwLGEudGl0bGVNYXhMZW5ndGgpK1wiLi4uXCIpLG4ubGVuZ3RoPmEubWVzc2FnZU1heExlbmd0aCYmKG49bi5zdWJzdHJpbmcoMCxhLm1lc3NhZ2VNYXhMZW5ndGgpK1wiLi4uXCIpLHIubGVuZ3RoPmEuYnV0dG9uc01heExlbmd0aCYmKHI9ci5zdWJzdHJpbmcoMCxhLmJ1dHRvbnNNYXhMZW5ndGgpK1wiLi4uXCIpLGwubGVuZ3RoPmEuYnV0dG9uc01heExlbmd0aCYmKGw9bC5zdWJzdHJpbmcoMCxhLmJ1dHRvbnNNYXhMZW5ndGgpK1wiLi4uXCIpLGEuY3NzQW5pbWF0aW9ufHwoYS5jc3NBbmltYXRpb25EdXJhdGlvbj0wKTt2YXIgZz10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zy5pZD1kLklELGcuY2xhc3NOYW1lPWEuY2xhc3NOYW1lKyhhLmNzc0FuaW1hdGlvbj9cIiBueC13aXRoLWFuaW1hdGlvbiBueC1cIithLmNzc0FuaW1hdGlvblN0eWxlOlwiXCIpLGcuc3R5bGUuekluZGV4PWEuemluZGV4LGcuc3R5bGUucGFkZGluZz1hLmRpc3RhbmNlLGEucnRsJiYoZy5zZXRBdHRyaWJ1dGUoXCJkaXJcIixcInJ0bFwiKSxnLmNsYXNzTGlzdC5hZGQoXCJueC1ydGwtb25cIikpO3ZhciBiPVwic3RyaW5nXCI9PXR5cGVvZiBhLnBvc2l0aW9uP2EucG9zaXRpb24udHJpbSgpOlwiY2VudGVyXCI7Zy5jbGFzc0xpc3QuYWRkKFwibngtcG9zaXRpb24tXCIrYiksZy5zdHlsZS5mb250RmFtaWx5PVwiXFxcIlwiK2EuZm9udEZhbWlseStcIlxcXCIsIFwiK3M7dmFyIHU9XCJcIjthLmJhY2tPdmVybGF5JiYodT1cIjxkaXYgY2xhc3M9XFxcIlwiK2EuY2xhc3NOYW1lK1wiLW92ZXJsYXlcIisoYS5jc3NBbmltYXRpb24/XCIgbngtd2l0aC1hbmltYXRpb25cIjpcIlwiKStcIlxcXCIgc3R5bGU9XFxcImJhY2tncm91bmQ6XCIrYS5iYWNrT3ZlcmxheUNvbG9yK1wiO2FuaW1hdGlvbi1kdXJhdGlvbjpcIithLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXM7XFxcIj48L2Rpdj5cIik7dmFyIHk9XCJcIjtcImZ1bmN0aW9uXCI9PXR5cGVvZiBtJiYoeT1cIjxhIGlkPVxcXCJOWENvbmZpcm1CdXR0b25DYW5jZWxcXFwiIGNsYXNzPVxcXCJueC1jb25maXJtLWJ1dHRvbi1jYW5jZWxcXFwiIHN0eWxlPVxcXCJjb2xvcjpcIithLmNhbmNlbEJ1dHRvbkNvbG9yK1wiO2JhY2tncm91bmQ6XCIrYS5jYW5jZWxCdXR0b25CYWNrZ3JvdW5kK1wiO2ZvbnQtc2l6ZTpcIithLmJ1dHRvbnNGb250U2l6ZStcIjtcXFwiPlwiK2wrXCI8L2E+XCIpO3ZhciBrPVwiXCIsaD1udWxsLEM9dm9pZCAwO2lmKGU9PT1mLkFza3x8ZT09PWYuUHJvbXB0KXtoPW98fFwiXCI7dmFyIHo9ZT09PWYuQXNrP01hdGguY2VpbCgxLjUqaC5sZW5ndGgpOjIwMDxoLmxlbmd0aD9NYXRoLmNlaWwoMS41KmgubGVuZ3RoKToyNTAsUz1lPT09Zi5Qcm9tcHQ/XCJ2YWx1ZT1cXFwiXCIraCtcIlxcXCJcIjpcIlwiO2s9XCI8ZGl2PjxpbnB1dCBpZD1cXFwiTlhDb25maXJtVmFsaWRhdGlvbklucHV0XFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBcIitTK1wiIG1heGxlbmd0aD1cXFwiXCIreitcIlxcXCIgc3R5bGU9XFxcImZvbnQtc2l6ZTpcIithLm1lc3NhZ2VGb250U2l6ZStcIjtib3JkZXItcmFkaXVzOiBcIithLmJvcmRlclJhZGl1cytcIjtcXFwiIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBzcGVsbGNoZWNrPVxcXCJmYWxzZVxcXCIgYXV0b2NhcGl0YWxpemU9XFxcIm5vbmVcXFwiIC8+PC9kaXY+XCJ9aWYoZy5pbm5lckhUTUw9dStcIjxkaXYgY2xhc3M9XFxcIlwiK2EuY2xhc3NOYW1lK1wiLWNvbnRlbnRcXFwiIHN0eWxlPVxcXCJ3aWR0aDpcIithLndpZHRoK1wiOyBiYWNrZ3JvdW5kOlwiK2EuYmFja2dyb3VuZENvbG9yK1wiOyBhbmltYXRpb24tZHVyYXRpb246XCIrYS5jc3NBbmltYXRpb25EdXJhdGlvbitcIm1zOyBib3JkZXItcmFkaXVzOiBcIithLmJvcmRlclJhZGl1cytcIjtcXFwiPjxkaXYgY2xhc3M9XFxcIlwiK2EuY2xhc3NOYW1lK1wiLWhlYWRcXFwiPjxoNSBzdHlsZT1cXFwiY29sb3I6XCIrYS50aXRsZUNvbG9yK1wiO2ZvbnQtc2l6ZTpcIithLnRpdGxlRm9udFNpemUrXCI7XFxcIj5cIitpK1wiPC9oNT48ZGl2IHN0eWxlPVxcXCJjb2xvcjpcIithLm1lc3NhZ2VDb2xvcitcIjtmb250LXNpemU6XCIrYS5tZXNzYWdlRm9udFNpemUrXCI7XFxcIj5cIituK2srXCI8L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPVxcXCJcIithLmNsYXNzTmFtZStcIi1idXR0b25zXFxcIj48YSBpZD1cXFwiTlhDb25maXJtQnV0dG9uT2tcXFwiIGNsYXNzPVxcXCJueC1jb25maXJtLWJ1dHRvbi1va1wiKyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBtP1wiXCI6XCIgbngtZnVsbFwiKStcIlxcXCIgc3R5bGU9XFxcImNvbG9yOlwiK2Eub2tCdXR0b25Db2xvcitcIjtiYWNrZ3JvdW5kOlwiK2Eub2tCdXR0b25CYWNrZ3JvdW5kK1wiO2ZvbnQtc2l6ZTpcIithLmJ1dHRvbnNGb250U2l6ZStcIjtcXFwiPlwiK3IrXCI8L2E+XCIreStcIjwvZGl2PjwvZGl2PlwiLCF0LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGcuaWQpKXt0LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7dmFyIEw9dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChnLmlkKSxXPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJOWENvbmZpcm1CdXR0b25Pa1wiKSxJPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJOWENvbmZpcm1WYWxpZGF0aW9uSW5wdXRcIik7aWYoSSYmKEkuZm9jdXMoKSxJLnNldFNlbGVjdGlvblJhbmdlKDAsKEkudmFsdWV8fFwiXCIpLmxlbmd0aCksSS5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIixmdW5jdGlvbih0KXt2YXIgaT10LnRhcmdldC52YWx1ZTtpZihlPT09Zi5Bc2smJmkhPT1oKXQucHJldmVudERlZmF1bHQoKSxJLmNsYXNzTGlzdC5hZGQoXCJueC12YWxpZGF0aW9uLWZhaWx1cmVcIiksSS5jbGFzc0xpc3QucmVtb3ZlKFwibngtdmFsaWRhdGlvbi1zdWNjZXNzXCIpO2Vsc2V7ZT09PWYuQXNrJiYoSS5jbGFzc0xpc3QucmVtb3ZlKFwibngtdmFsaWRhdGlvbi1mYWlsdXJlXCIpLEkuY2xhc3NMaXN0LmFkZChcIm54LXZhbGlkYXRpb24tc3VjY2Vzc1wiKSk7dmFyIGE9XCJlbnRlclwiPT09KHQua2V5fHxcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZShcImVuXCIpfHwxMz09PXQua2V5Q29kZTthJiZXLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2xpY2tcIikpfX0pKSxXLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKHQpe2lmKGU9PT1mLkFzayYmaCYmSSl7dmFyIGk9KEkudmFsdWV8fFwiXCIpLnRvU3RyaW5nKCk7aWYoaSE9PWgpcmV0dXJuIEkuZm9jdXMoKSxJLmNsYXNzTGlzdC5hZGQoXCJueC12YWxpZGF0aW9uLWZhaWx1cmVcIiksdC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCksdC5yZXR1cm5WYWx1ZT0hMSx0LmNhbmNlbEJ1YmJsZT0hMCwhMTtJLmNsYXNzTGlzdC5yZW1vdmUoXCJueC12YWxpZGF0aW9uLWZhaWx1cmVcIil9XCJmdW5jdGlvblwiPT10eXBlb2YgbSYmKGU9PT1mLlByb21wdCYmSSYmKEM9SS52YWx1ZXx8XCJcIiksbShDKSksTC5jbGFzc0xpc3QuYWRkKFwibngtcmVtb3ZlXCIpO3ZhciBuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtudWxsIT09TC5wYXJlbnROb2RlJiYoTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEwpLGNsZWFyVGltZW91dChuKSl9LGEuY3NzQW5pbWF0aW9uRHVyYXRpb24pfSksXCJmdW5jdGlvblwiPT10eXBlb2YgbSl7dmFyIFI9dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIk5YQ29uZmlybUJ1dHRvbkNhbmNlbFwiKTtSLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7XCJmdW5jdGlvblwiPT10eXBlb2YgYyYmKGU9PT1mLlByb21wdCYmSSYmKEM9SS52YWx1ZXx8XCJcIiksYyhDKSksTC5jbGFzc0xpc3QuYWRkKFwibngtcmVtb3ZlXCIpO3ZhciB0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtudWxsIT09TC5wYXJlbnROb2RlJiYoTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEwpLGNsZWFyVGltZW91dCh0KSl9LGEuY3NzQW5pbWF0aW9uRHVyYXRpb24pfSl9fWE9dighMCxhLHgpfSxQPWZ1bmN0aW9uKCl7cmV0dXJuXCJbaWRePU5vdGlmbGl4TG9hZGluZ1dyYXBdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjQwMDA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtsZWZ0OjA7dG9wOjA7cmlnaHQ6MDtib3R0b206MDttYXJnaW46YXV0bztkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LXdlYmtpdC1mbGV4O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtZmxleC13cmFwOndyYXA7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy13ZWJraXQtZmxleC1kaXJlY3Rpb246Y29sdW1uOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uOy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstd2Via2l0LWFsaWduLWl0ZW1zOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy13ZWJraXQtanVzdGlmeS1jb250ZW50OmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RleHQtYWxpZ246Y2VudGVyOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpO2ZvbnQtZmFtaWx5OlxcXCJRdWlja3NhbmRcXFwiLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJTZWdvZSBVSVxcXCIsUm9ib3RvLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZn1baWRePU5vdGlmbGl4TG9hZGluZ1dyYXBdICp7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fVtpZF49Tm90aWZsaXhMb2FkaW5nV3JhcF0ubngtbG9hZGluZy1jbGljay10by1jbG9zZXtjdXJzb3I6cG9pbnRlcn1baWRePU5vdGlmbGl4TG9hZGluZ1dyYXBdPmRpdltjbGFzcyo9XFxcIi1pY29uXFxcIl17d2lkdGg6NjBweDtoZWlnaHQ6NjBweDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXRyYW5zaXRpb246dG9wIC4ycyBlYXNlLWluLW91dDstby10cmFuc2l0aW9uOnRvcCAuMnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0b3AgLjJzIGVhc2UtaW4tb3V0O21hcmdpbjowIGF1dG99W2lkXj1Ob3RpZmxpeExvYWRpbmdXcmFwXT5kaXZbY2xhc3MqPVxcXCItaWNvblxcXCJdIGltZyxbaWRePU5vdGlmbGl4TG9hZGluZ1dyYXBdPmRpdltjbGFzcyo9XFxcIi1pY29uXFxcIl0gc3Zne21heC13aWR0aDp1bnNldDttYXgtaGVpZ2h0OnVuc2V0O3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowfVtpZF49Tm90aWZsaXhMb2FkaW5nV3JhcF0+cHtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MTBweCBhdXRvIDA7Zm9udC1mYW1pbHk6aW5oZXJpdCFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZToxNXB4O2xpbmUtaGVpZ2h0OjEuNDtwYWRkaW5nOjAgMTBweDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyfVtpZF49Tm90aWZsaXhMb2FkaW5nV3JhcF0ubngtd2l0aC1hbmltYXRpb257LXdlYmtpdC1hbmltYXRpb246bG9hZGluZy1hbmltYXRpb24tZmFkZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsO2FuaW1hdGlvbjpsb2FkaW5nLWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIGxvYWRpbmctYW5pbWF0aW9uLWZhZGV7MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGxvYWRpbmctYW5pbWF0aW9uLWZhZGV7MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1baWRePU5vdGlmbGl4TG9hZGluZ1dyYXBdLm54LXdpdGgtYW5pbWF0aW9uLm54LXJlbW92ZXtvcGFjaXR5OjA7LXdlYmtpdC1hbmltYXRpb246bG9hZGluZy1hbmltYXRpb24tZmFkZS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbDthbmltYXRpb246bG9hZGluZy1hbmltYXRpb24tZmFkZS1yZW1vdmUgLjNzIGVhc2UtaW4tb3V0IDBzIG5vcm1hbH1ALXdlYmtpdC1rZXlmcmFtZXMgbG9hZGluZy1hbmltYXRpb24tZmFkZS1yZW1vdmV7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGxvYWRpbmctYW5pbWF0aW9uLWZhZGUtcmVtb3ZlezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19W2lkXj1Ob3RpZmxpeExvYWRpbmdXcmFwXT5wLm54LWxvYWRpbmctbWVzc2FnZS1uZXd7LXdlYmtpdC1hbmltYXRpb246bG9hZGluZy1uZXctbWVzc2FnZS1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOmxvYWRpbmctbmV3LW1lc3NhZ2UtZmFkZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBsb2FkaW5nLW5ldy1tZXNzYWdlLWZhZGV7MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGxvYWRpbmctbmV3LW1lc3NhZ2UtZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fVwifSxVPWZ1bmN0aW9uKGUsaSxhLG8scil7aWYoIXcoXCJib2R5XCIpKXJldHVybiExO258fEcuTG9hZGluZy5pbml0KHt9KTt2YXIgbD12KCEwLG4se30pO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBpJiYhQXJyYXkuaXNBcnJheShpKXx8XCJvYmplY3RcIj09dHlwZW9mIGEmJiFBcnJheS5pc0FycmF5KGEpKXt2YXIgbT17fTtcIm9iamVjdFwiPT10eXBlb2YgaT9tPWk6XCJvYmplY3RcIj09dHlwZW9mIGEmJihtPWEpLG49dighMCxuLG0pfXZhciBjPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJjA8aS5sZW5ndGgmJihjPWkpLG8pe2M9Yy5sZW5ndGg+bi5tZXNzYWdlTWF4TGVuZ3RoP04oYykudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCxuLm1lc3NhZ2VNYXhMZW5ndGgpK1wiLi4uXCI6TihjKS50b1N0cmluZygpO3ZhciBwPVwiXCI7MDxjLmxlbmd0aCYmKHA9XCI8cCBpZD1cXFwiXCIrbi5tZXNzYWdlSUQrXCJcXFwiIGNsYXNzPVxcXCJueC1sb2FkaW5nLW1lc3NhZ2VcXFwiIHN0eWxlPVxcXCJjb2xvcjpcIituLm1lc3NhZ2VDb2xvcitcIjtmb250LXNpemU6XCIrbi5tZXNzYWdlRm9udFNpemUrXCI7XFxcIj5cIitjK1wiPC9wPlwiKSxuLmNzc0FuaW1hdGlvbnx8KG4uY3NzQW5pbWF0aW9uRHVyYXRpb249MCk7dmFyIGY9XCJcIjtpZihlPT09eC5TdGFuZGFyZClmPVcobi5zdmdTaXplLG4uc3ZnQ29sb3IpO2Vsc2UgaWYoZT09PXguSG91cmdsYXNzKWY9SShuLnN2Z1NpemUsbi5zdmdDb2xvcik7ZWxzZSBpZihlPT09eC5DaXJjbGUpZj1SKG4uc3ZnU2l6ZSxuLnN2Z0NvbG9yKTtlbHNlIGlmKGU9PT14LkFycm93cylmPUEobi5zdmdTaXplLG4uc3ZnQ29sb3IpO2Vsc2UgaWYoZT09PXguRG90cylmPU0obi5zdmdTaXplLG4uc3ZnQ29sb3IpO2Vsc2UgaWYoZT09PXguUHVsc2UpZj1CKG4uc3ZnU2l6ZSxuLnN2Z0NvbG9yKTtlbHNlIGlmKGU9PT14LkN1c3RvbSYmbnVsbCE9PW4uY3VzdG9tU3ZnQ29kZSYmbnVsbD09PW4uY3VzdG9tU3ZnVXJsKWY9bi5jdXN0b21TdmdDb2RlfHxcIlwiO2Vsc2UgaWYoZT09PXguQ3VzdG9tJiZudWxsIT09bi5jdXN0b21TdmdVcmwmJm51bGw9PT1uLmN1c3RvbVN2Z0NvZGUpZj1cIjxpbWcgY2xhc3M9XFxcIm54LWN1c3RvbS1sb2FkaW5nLWljb25cXFwiIHdpZHRoPVxcXCJcIituLnN2Z1NpemUrXCJcXFwiIGhlaWdodD1cXFwiXCIrbi5zdmdTaXplK1wiXFxcIiBzcmM9XFxcIlwiK24uY3VzdG9tU3ZnVXJsK1wiXFxcIiBhbHQ9XFxcIk5vdGlmbGl4XFxcIj5cIjtlbHNle2lmKGU9PT14LkN1c3RvbSYmKG51bGw9PT1uLmN1c3RvbVN2Z1VybHx8bnVsbD09PW4uY3VzdG9tU3ZnQ29kZSkpcmV0dXJuIHkoXCJZb3UgaGF2ZSB0byBzZXQgYSBzdGF0aWMgU1ZHIHVybCB0byBcXFwiY3VzdG9tU3ZnVXJsXFxcIiBvcHRpb24gdG8gdXNlIExvYWRpbmcgQ3VzdG9tLlwiKSwhMTtmPVgobi5zdmdTaXplLFwiI2Y4ZjhmOFwiLFwiIzMyYzY4MlwiKX12YXIgZD1wYXJzZUludCgobi5zdmdTaXplfHxcIlwiKS5yZXBsYWNlKC9bXjAtOV0vZyxcIlwiKSksYj10LmlubmVyV2lkdGgsdT1kPj1iP2ItNDArXCJweFwiOmQrXCJweFwiLGs9XCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDpcIit1K1wiOyBoZWlnaHQ6XCIrdStcIjtcXFwiIGNsYXNzPVxcXCJcIituLmNsYXNzTmFtZStcIi1pY29uXCIrKDA8Yy5sZW5ndGg/XCIgbngtd2l0aC1tZXNzYWdlXCI6XCJcIikrXCJcXFwiPlwiK2YrXCI8L2Rpdj5cIixoPXQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpZihoLmlkPWcuSUQsaC5jbGFzc05hbWU9bi5jbGFzc05hbWUrKG4uY3NzQW5pbWF0aW9uP1wiIG54LXdpdGgtYW5pbWF0aW9uXCI6XCJcIikrKG4uY2xpY2tUb0Nsb3NlP1wiIG54LWxvYWRpbmctY2xpY2stdG8tY2xvc2VcIjpcIlwiKSxoLnN0eWxlLnpJbmRleD1uLnppbmRleCxoLnN0eWxlLmJhY2tncm91bmQ9bi5iYWNrZ3JvdW5kQ29sb3IsaC5zdHlsZS5hbmltYXRpb25EdXJhdGlvbj1uLmNzc0FuaW1hdGlvbkR1cmF0aW9uK1wibXNcIixoLnN0eWxlLmZvbnRGYW1pbHk9XCJcXFwiXCIrbi5mb250RmFtaWx5K1wiXFxcIiwgXCIrcyxoLnN0eWxlLmRpc3BsYXk9XCJmbGV4XCIsaC5zdHlsZS5mbGV4V3JhcD1cIndyYXBcIixoLnN0eWxlLmZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIixoLnN0eWxlLmFsaWduSXRlbXM9XCJjZW50ZXJcIixoLnN0eWxlLmp1c3RpZnlDb250ZW50PVwiY2VudGVyXCIsbi5ydGwmJihoLnNldEF0dHJpYnV0ZShcImRpclwiLFwicnRsXCIpLGguY2xhc3NMaXN0LmFkZChcIm54LXJ0bC1vblwiKSksaC5pbm5lckhUTUw9aytwLCF0LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGguaWQpJiYodC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpLG4uY2xpY2tUb0Nsb3NlKSl7dmFyIEM9dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChoLmlkKTtDLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7aC5jbGFzc0xpc3QuYWRkKFwibngtcmVtb3ZlXCIpO3ZhciB0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtudWxsIT09aC5wYXJlbnROb2RlJiYoaC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGgpLGNsZWFyVGltZW91dCh0KSl9LG4uY3NzQW5pbWF0aW9uRHVyYXRpb24pfSl9fWVsc2UgaWYodC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChnLklEKSl2YXIgej10LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGcuSUQpLFM9c2V0VGltZW91dChmdW5jdGlvbigpe3ouY2xhc3NMaXN0LmFkZChcIm54LXJlbW92ZVwiKTt2YXIgdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bnVsbCE9PXoucGFyZW50Tm9kZSYmKHoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh6KSxjbGVhclRpbWVvdXQodCkpfSxuLmNzc0FuaW1hdGlvbkR1cmF0aW9uKTtjbGVhclRpbWVvdXQoUyl9LHIpO249dighMCxuLGwpfSxWPWZ1bmN0aW9uKGUpe1wic3RyaW5nXCIhPXR5cGVvZiBlJiYoZT1cIlwiKTt2YXIgaT10LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGcuSUQpO2lmKGkpaWYoMDxlLmxlbmd0aCl7ZT1lLmxlbmd0aD5uLm1lc3NhZ2VNYXhMZW5ndGg/TihlKS5zdWJzdHJpbmcoMCxuLm1lc3NhZ2VNYXhMZW5ndGgpK1wiLi4uXCI6TihlKTt2YXIgYT1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwicFwiKVswXTtpZihhKWEuaW5uZXJIVE1MPWU7ZWxzZXt2YXIgbz10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO28uaWQ9bi5tZXNzYWdlSUQsby5jbGFzc05hbWU9XCJueC1sb2FkaW5nLW1lc3NhZ2UgbngtbG9hZGluZy1tZXNzYWdlLW5ld1wiLG8uc3R5bGUuY29sb3I9bi5tZXNzYWdlQ29sb3Isby5zdHlsZS5mb250U2l6ZT1uLm1lc3NhZ2VGb250U2l6ZSxvLmlubmVySFRNTD1lLGkuYXBwZW5kQ2hpbGQobyl9fWVsc2UgeShcIldoZXJlIGlzIHRoZSBuZXcgbWVzc2FnZT9cIil9LHE9ZnVuY3Rpb24oKXtyZXR1cm5cIltpZF49Tm90aWZsaXhCbG9ja1dyYXBdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2ZvbnQtZmFtaWx5OlxcXCJRdWlja3NhbmRcXFwiLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFxcXCJTZWdvZSBVSVxcXCIsUm9ib3RvLFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsQXJpYWwsc2Fucy1zZXJpZjtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjkpO3RleHQtYWxpZ246Y2VudGVyO2FuaW1hdGlvbi1kdXJhdGlvbjouNHM7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtsZWZ0OjA7dG9wOjA7Ym9yZGVyLXJhZGl1czppbmhlcml0O2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotd2Via2l0LWZsZXg7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1mbGV4LXdyYXA6d3JhcDstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LXdlYmtpdC1mbGV4LWRpcmVjdGlvbjpjb2x1bW47LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy13ZWJraXQtYWxpZ24taXRlbXM6Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9W2lkXj1Ob3RpZmxpeEJsb2NrV3JhcF0gKnstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9W2lkXj1Ob3RpZmxpeEJsb2NrV3JhcF0+c3BhbltjbGFzcyo9XFxcIi1pY29uXFxcIl17ZGlzcGxheTpibG9jazt3aWR0aDo0NXB4O2hlaWdodDo0NXB4O3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowIGF1dG99W2lkXj1Ob3RpZmxpeEJsb2NrV3JhcF0+c3BhbltjbGFzcyo9XFxcIi1pY29uXFxcIl0gc3Zne3dpZHRoOmluaGVyaXQ7aGVpZ2h0OmluaGVyaXR9W2lkXj1Ob3RpZmxpeEJsb2NrV3JhcF0+c3BhbltjbGFzcyo9XFxcIi1tZXNzYWdlXFxcIl17cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21hcmdpbjoxMHB4IGF1dG8gMDtwYWRkaW5nOjAgMTBweDtmb250LWZhbWlseTppbmhlcml0IWltcG9ydGFudDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40fVtpZF49Tm90aWZsaXhCbG9ja1dyYXBdLm54LXdpdGgtYW5pbWF0aW9uey13ZWJraXQtYW5pbWF0aW9uOmJsb2NrLWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOmJsb2NrLWFuaW1hdGlvbi1mYWRlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWx9QC13ZWJraXQta2V5ZnJhbWVzIGJsb2NrLWFuaW1hdGlvbi1mYWRlezAle29wYWNpdHk6MH0xMDAle29wYWNpdHk6MX19QGtleWZyYW1lcyBibG9jay1hbmltYXRpb24tZmFkZXswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fVtpZF49Tm90aWZsaXhCbG9ja1dyYXBdLm54LXdpdGgtYW5pbWF0aW9uLm54LXJlbW92ZXtvcGFjaXR5OjA7LXdlYmtpdC1hbmltYXRpb246YmxvY2stYW5pbWF0aW9uLWZhZGUtcmVtb3ZlIC4zcyBlYXNlLWluLW91dCAwcyBub3JtYWw7YW5pbWF0aW9uOmJsb2NrLWFuaW1hdGlvbi1mYWRlLXJlbW92ZSAuM3MgZWFzZS1pbi1vdXQgMHMgbm9ybWFsfUAtd2Via2l0LWtleWZyYW1lcyBibG9jay1hbmltYXRpb24tZmFkZS1yZW1vdmV7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGJsb2NrLWFuaW1hdGlvbi1mYWRlLXJlbW92ZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fVwifSxRPTAsWT1mdW5jdGlvbihlLGksYSxuLHIsbCl7dmFyIG07aWYoQXJyYXkuaXNBcnJheShhKSl7aWYoMT5hLmxlbmd0aClyZXR1cm4geShcIkFycmF5IG9mIEhUTUxFbGVtZW50cyBzaG91bGQgY29udGFpbnMgYXQgbGVhc3Qgb25lIEhUTUxFbGVtZW50LlwiKSwhMTttPWF9ZWxzZSBpZihPYmplY3QucHJvdG90eXBlLmlzUHJvdG90eXBlT2YuY2FsbChOb2RlTGlzdC5wcm90b3R5cGUsYSkpe2lmKDE+YS5sZW5ndGgpcmV0dXJuIHkoXCJOb2RlTGlzdE9mPEhUTUxFbGVtZW50PiBzaG91bGQgY29udGFpbnMgYXQgbGVhc3Qgb25lIEhUTUxFbGVtZW50LlwiKSwhMTttPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfWVsc2V7dmFyIGM9XCJzdHJpbmdcIiE9dHlwZW9mIGF8fDE+KGF8fFwiXCIpLmxlbmd0aHx8MT09PShhfHxcIlwiKS5sZW5ndGgmJihcIiNcIj09PShhfHxcIlwiKVswXXx8XCIuXCI9PT0oYXx8XCJcIilbMF0pO2lmKGMpcmV0dXJuIHkoXCJUaGUgc2VsZWN0b3IgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgYW5kIG1hdGNoZXMgYSBzcGVjaWZpZWQgQ1NTIHNlbGVjdG9yKHMpLlwiKSwhMTt2YXIgcD10LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYSk7aWYoMT5wLmxlbmd0aClyZXR1cm4geShcIllvdSBjYWxsZWQgdGhlIFxcXCJOb3RpZmxpeC5CbG9jay4uLlxcXCIgZnVuY3Rpb24gd2l0aCBcXFwiXCIrYStcIlxcXCIgc2VsZWN0b3IsIGJ1dCB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnQocykgaW4gdGhlIGRvY3VtZW50LlwiKSwhMTttPXB9b3x8Ry5CbG9jay5pbml0KHt9KTt2YXIgZj12KCEwLG8se30pO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBuJiYhQXJyYXkuaXNBcnJheShuKXx8XCJvYmplY3RcIj09dHlwZW9mIHImJiFBcnJheS5pc0FycmF5KHIpKXt2YXIgZD17fTtcIm9iamVjdFwiPT10eXBlb2Ygbj9kPW46XCJvYmplY3RcIj09dHlwZW9mIHImJihkPXIpLG89dighMCxvLGQpfXZhciB4PVwiXCI7XCJzdHJpbmdcIj09dHlwZW9mIG4mJjA8bi5sZW5ndGgmJih4PW4pLG8uY3NzQW5pbWF0aW9ufHwoby5jc3NBbmltYXRpb25EdXJhdGlvbj0wKTt2YXIgZz11LmNsYXNzTmFtZTtcInN0cmluZ1wiPT10eXBlb2Ygby5jbGFzc05hbWUmJihnPW8uY2xhc3NOYW1lLnRyaW0oKSk7dmFyIGg9XCJudW1iZXJcIj09dHlwZW9mIG8ucXVlcnlTZWxlY3RvckxpbWl0P28ucXVlcnlTZWxlY3RvckxpbWl0OjIwMCxDPShtfHxbXSkubGVuZ3RoPj1oP2g6bS5sZW5ndGgsej1cIm54LWJsb2NrLXRlbXBvcmFyeS1wb3NpdGlvblwiO2lmKGUpe2Zvcih2YXIgUyxMPVtcImFyZWFcIixcImJhc2VcIixcImJyXCIsXCJjb2xcIixcImNvbW1hbmRcIixcImVtYmVkXCIsXCJoclwiLFwiaW1nXCIsXCJpbnB1dFwiLFwia2V5Z2VuXCIsXCJsaW5rXCIsXCJtZXRhXCIsXCJwYXJhbVwiLFwic291cmNlXCIsXCJ0cmFja1wiLFwid2JyXCIsXCJodG1sXCIsXCJoZWFkXCIsXCJ0aXRsZVwiLFwic2NyaXB0XCIsXCJzdHlsZVwiLFwiaWZyYW1lXCJdLFg9MDtYPEM7WCsrKWlmKFM9bVtYXSxTKXtpZigtMTxMLmluZGV4T2YoUy50YWdOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW5cIikpKWJyZWFrO3ZhciBEPVMucXVlcnlTZWxlY3RvckFsbChcIltpZF49XCIrdS5JRCtcIl1cIik7aWYoMT5ELmxlbmd0aCl7dmFyIFQ9XCJcIjtpJiYoaT09PWIuSG91cmdsYXNzP1Q9SShvLnN2Z1NpemUsby5zdmdDb2xvcik6aT09PWIuQ2lyY2xlP1Q9UihvLnN2Z1NpemUsby5zdmdDb2xvcik6aT09PWIuQXJyb3dzP1Q9QShvLnN2Z1NpemUsby5zdmdDb2xvcik6aT09PWIuRG90cz9UPU0oby5zdmdTaXplLG8uc3ZnQ29sb3IpOmk9PT1iLlB1bHNlP1Q9QihvLnN2Z1NpemUsby5zdmdDb2xvcik6VD1XKG8uc3ZnU2l6ZSxvLnN2Z0NvbG9yKSk7dmFyIEY9XCI8c3BhbiBjbGFzcz1cXFwiXCIrZytcIi1pY29uXFxcIiBzdHlsZT1cXFwid2lkdGg6XCIrby5zdmdTaXplK1wiO2hlaWdodDpcIitvLnN2Z1NpemUrXCI7XFxcIj5cIitUK1wiPC9zcGFuPlwiLEU9XCJcIjswPHgubGVuZ3RoJiYoeD14Lmxlbmd0aD5vLm1lc3NhZ2VNYXhMZW5ndGg/Tih4KS5zdWJzdHJpbmcoMCxvLm1lc3NhZ2VNYXhMZW5ndGgpK1wiLi4uXCI6Tih4KSxFPVwiPHNwYW4gc3R5bGU9XFxcImZvbnQtc2l6ZTpcIitvLm1lc3NhZ2VGb250U2l6ZStcIjtjb2xvcjpcIitvLm1lc3NhZ2VDb2xvcitcIjtcXFwiIGNsYXNzPVxcXCJcIitnK1wiLW1lc3NhZ2VcXFwiPlwiK3grXCI8L3NwYW4+XCIpLFErKzt2YXIgaj10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ai5pZD11LklEK1wiLVwiK1Esai5jbGFzc05hbWU9Zysoby5jc3NBbmltYXRpb24/XCIgbngtd2l0aC1hbmltYXRpb25cIjpcIlwiKSxqLnN0eWxlLnBvc2l0aW9uPW8ucG9zaXRpb24sai5zdHlsZS56SW5kZXg9by56aW5kZXgsai5zdHlsZS5iYWNrZ3JvdW5kPW8uYmFja2dyb3VuZENvbG9yLGouc3R5bGUuYW5pbWF0aW9uRHVyYXRpb249by5jc3NBbmltYXRpb25EdXJhdGlvbitcIm1zXCIsai5zdHlsZS5mb250RmFtaWx5PVwiXFxcIlwiK28uZm9udEZhbWlseStcIlxcXCIsIFwiK3Msai5zdHlsZS5kaXNwbGF5PVwiZmxleFwiLGouc3R5bGUuZmxleFdyYXA9XCJ3cmFwXCIsai5zdHlsZS5mbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIsai5zdHlsZS5hbGlnbkl0ZW1zPVwiY2VudGVyXCIsai5zdHlsZS5qdXN0aWZ5Q29udGVudD1cImNlbnRlclwiLG8ucnRsJiYoai5zZXRBdHRyaWJ1dGUoXCJkaXJcIixcInJ0bFwiKSxqLmNsYXNzTGlzdC5hZGQoXCJueC1ydGwtb25cIikpLGouaW5uZXJIVE1MPUYrRTt2YXIgTz10LmdldENvbXB1dGVkU3R5bGUoUykuZ2V0UHJvcGVydHlWYWx1ZShcInBvc2l0aW9uXCIpLEg9XCJzdHJpbmdcIj09dHlwZW9mIE8/Ty50b0xvY2FsZUxvd2VyQ2FzZShcImVuXCIpOlwicmVsYXRpdmVcIixQPU1hdGgucm91bmQoMS4yNSpwYXJzZUludChvLnN2Z1NpemUpKSs0MCxVPVMub2Zmc2V0SGVpZ2h0fHwwLFY9XCJcIjtQPlUmJihWPVwibWluLWhlaWdodDpcIitQK1wicHg7XCIpO3ZhciBxPVwiXCI7cT1TLmdldEF0dHJpYnV0ZShcImlkXCIpP1wiI1wiK1MuZ2V0QXR0cmlidXRlKFwiaWRcIik6Uy5jbGFzc0xpc3RbMF0/XCIuXCIrUy5jbGFzc0xpc3RbMF06KFMudGFnTmFtZXx8XCJcIikudG9Mb2NhbGVMb3dlckNhc2UoXCJlblwiKTt2YXIgWT1cIlwiLEs9LTE+PVtcImFic29sdXRlXCIsXCJyZWxhdGl2ZVwiLFwiZml4ZWRcIixcInN0aWNreVwiXS5pbmRleE9mKEgpO2lmKEt8fDA8Vi5sZW5ndGgpe2lmKCF3KFwiaGVhZFwiKSlyZXR1cm4hMTtLJiYoWT1cInBvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudDtcIik7dmFyICQ9XCI8c3R5bGUgaWQ9XFxcIlN0eWxlLVwiK3UuSUQrXCItXCIrUStcIlxcXCI+XCIrcStcIi5cIit6K1wie1wiK1krVitcIn08L3N0eWxlPlwiLEo9dC5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO0ouc2VsZWN0Tm9kZSh0LmRvY3VtZW50LmhlYWQpO3ZhciBaPUouY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KCQpO3QuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChaKSxTLmNsYXNzTGlzdC5hZGQoeil9Uy5hcHBlbmRDaGlsZChqKX19fWVsc2UgdmFyIF89ZnVuY3Rpb24oZSl7dmFyIGk9c2V0VGltZW91dChmdW5jdGlvbigpe251bGwhPT1lLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTt2YXIgYT1lLmdldEF0dHJpYnV0ZShcImlkXCIpLG49dC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIlN0eWxlLVwiK2EpO24mJm51bGwhPT1uLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxjbGVhclRpbWVvdXQoaSl9LG8uY3NzQW5pbWF0aW9uRHVyYXRpb24pfSx0dD1mdW5jdGlvbih0KXtpZih0JiYwPHQubGVuZ3RoKWZvcih2YXIgZSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUmJihlLmNsYXNzTGlzdC5hZGQoXCJueC1yZW1vdmVcIiksXyhlKSk7ZWxzZVwic3RyaW5nXCI9PXR5cGVvZiBhP2soXCJcXFwiTm90aWZsaXguQmxvY2sucmVtb3ZlKCk7XFxcIiBmdW5jdGlvbiBjYWxsZWQgd2l0aCBcXFwiXCIrYStcIlxcXCIgc2VsZWN0b3IsIGJ1dCB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGhhdmUgYSBcXFwiQmxvY2tcXFwiIGVsZW1lbnQgdG8gcmVtb3ZlLlwiKTprKFwiXFxcIk5vdGlmbGl4LkJsb2NrLnJlbW92ZSgpO1xcXCIgZnVuY3Rpb24gY2FsbGVkIHdpdGggXFxcIlwiK2ErXCJcXFwiLCBidXQgdGhpcyBcXFwiQXJyYXk8SFRNTEVsZW1lbnQ+XFxcIiBvciBcXFwiTm9kZUxpc3RPZjxIVE1MRWxlbWVudD5cXFwiIGRvZXMgbm90IGhhdmUgYSBcXFwiQmxvY2tcXFwiIGVsZW1lbnQgdG8gcmVtb3ZlLlwiKX0sZXQ9ZnVuY3Rpb24odCl7dmFyIGU9c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LnJlbW92ZSh6KSxjbGVhclRpbWVvdXQoZSl9LG8uY3NzQW5pbWF0aW9uRHVyYXRpb24rMzAwKX0saXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7ZTxDO2UrKyl0PW1bZV0sdCYmKGV0KHQpLEQ9dC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXj1cIit1LklEK1wiXVwiKSx0dChEKSk7Y2xlYXJUaW1lb3V0KGl0KX0sbCk7bz12KCEwLG8sZil9LEc9e05vdGlmeTp7aW5pdDpmdW5jdGlvbih0KXtlPXYoITAsbSx0KSxoKEQsXCJOb3RpZmxpeE5vdGlmeUludGVybmFsQ1NTXCIpfSxtZXJnZTpmdW5jdGlvbih0KXtyZXR1cm4gZT92b2lkKGU9dighMCxlLHQpKTooeShcIllvdSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIE5vdGlmeSBtb2R1bGUgYmVmb3JlIGNhbGwgTWVyZ2UgZnVuY3Rpb24uXCIpLCExKX0sc3VjY2VzczpmdW5jdGlvbih0LGUsaSl7RihsLlN1Y2Nlc3MsdCxlLGkpfSxmYWlsdXJlOmZ1bmN0aW9uKHQsZSxpKXtGKGwuRmFpbHVyZSx0LGUsaSl9LHdhcm5pbmc6ZnVuY3Rpb24odCxlLGkpe0YobC5XYXJuaW5nLHQsZSxpKX0saW5mbzpmdW5jdGlvbih0LGUsaSl7RihsLkluZm8sdCxlLGkpfX0sUmVwb3J0Ontpbml0OmZ1bmN0aW9uKHQpe2k9dighMCxwLHQpLGgoRSxcIk5vdGlmbGl4UmVwb3J0SW50ZXJuYWxDU1NcIil9LG1lcmdlOmZ1bmN0aW9uKHQpe3JldHVybiBpP3ZvaWQoaT12KCEwLGksdCkpOih5KFwiWW91IGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgUmVwb3J0IG1vZHVsZSBiZWZvcmUgY2FsbCBNZXJnZSBmdW5jdGlvbi5cIiksITEpfSxzdWNjZXNzOmZ1bmN0aW9uKHQsZSxpLGEsbil7aihjLlN1Y2Nlc3MsdCxlLGksYSxuKX0sZmFpbHVyZTpmdW5jdGlvbih0LGUsaSxhLG4pe2ooYy5GYWlsdXJlLHQsZSxpLGEsbil9LHdhcm5pbmc6ZnVuY3Rpb24odCxlLGksYSxuKXtqKGMuV2FybmluZyx0LGUsaSxhLG4pfSxpbmZvOmZ1bmN0aW9uKHQsZSxpLGEsbil7aihjLkluZm8sdCxlLGksYSxuKX19LENvbmZpcm06e2luaXQ6ZnVuY3Rpb24odCl7YT12KCEwLGQsdCksaChPLFwiTm90aWZsaXhDb25maXJtSW50ZXJuYWxDU1NcIil9LG1lcmdlOmZ1bmN0aW9uKHQpe3JldHVybiBhP3ZvaWQoYT12KCEwLGEsdCkpOih5KFwiWW91IGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgQ29uZmlybSBtb2R1bGUgYmVmb3JlIGNhbGwgTWVyZ2UgZnVuY3Rpb24uXCIpLCExKX0sc2hvdzpmdW5jdGlvbih0LGUsaSxhLG4sbyxyKXtIKGYuU2hvdyx0LGUsbnVsbCxpLGEsbixvLHIpfSxhc2s6ZnVuY3Rpb24odCxlLGksYSxuLG8scixzKXtIKGYuQXNrLHQsZSxpLGEsbixvLHIscyl9LHByb21wdDpmdW5jdGlvbih0LGUsaSxhLG4sbyxyLHMpe0goZi5Qcm9tcHQsdCxlLGksYSxuLG8scixzKX19LExvYWRpbmc6e2luaXQ6ZnVuY3Rpb24odCl7bj12KCEwLGcsdCksaChQLFwiTm90aWZsaXhMb2FkaW5nSW50ZXJuYWxDU1NcIil9LG1lcmdlOmZ1bmN0aW9uKHQpe3JldHVybiBuP3ZvaWQobj12KCEwLG4sdCkpOih5KFwiWW91IGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgTG9hZGluZyBtb2R1bGUgYmVmb3JlIGNhbGwgTWVyZ2UgZnVuY3Rpb24uXCIpLCExKX0sc3RhbmRhcmQ6ZnVuY3Rpb24odCxlKXtVKHguU3RhbmRhcmQsdCxlLCEwLDApfSxob3VyZ2xhc3M6ZnVuY3Rpb24odCxlKXtVKHguSG91cmdsYXNzLHQsZSwhMCwwKX0sY2lyY2xlOmZ1bmN0aW9uKHQsZSl7VSh4LkNpcmNsZSx0LGUsITAsMCl9LGFycm93czpmdW5jdGlvbih0LGUpe1UoeC5BcnJvd3MsdCxlLCEwLDApfSxkb3RzOmZ1bmN0aW9uKHQsZSl7VSh4LkRvdHMsdCxlLCEwLDApfSxwdWxzZTpmdW5jdGlvbih0LGUpe1UoeC5QdWxzZSx0LGUsITAsMCl9LGN1c3RvbTpmdW5jdGlvbih0LGUpe1UoeC5DdXN0b20sdCxlLCEwLDApfSxub3RpZmxpeDpmdW5jdGlvbih0LGUpe1UoeC5Ob3RpZmxpeCx0LGUsITAsMCl9LHJlbW92ZTpmdW5jdGlvbih0KXtcIm51bWJlclwiIT10eXBlb2YgdCYmKHQ9MCksVShudWxsLG51bGwsbnVsbCwhMSx0KX0sY2hhbmdlOmZ1bmN0aW9uKHQpe1YodCl9fSxCbG9jazp7aW5pdDpmdW5jdGlvbih0KXtvPXYoITAsdSx0KSxoKHEsXCJOb3RpZmxpeEJsb2NrSW50ZXJuYWxDU1NcIil9LG1lcmdlOmZ1bmN0aW9uKHQpe3JldHVybiBvP3ZvaWQobz12KCEwLG8sdCkpOih5KFwiWW91IGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgXFxcIk5vdGlmbGl4LkJsb2NrXFxcIiBtb2R1bGUgYmVmb3JlIGNhbGwgTWVyZ2UgZnVuY3Rpb24uXCIpLCExKX0sc3RhbmRhcmQ6ZnVuY3Rpb24odCxlLGkpe1koITAsYi5TdGFuZGFyZCx0LGUsaSl9LGhvdXJnbGFzczpmdW5jdGlvbih0LGUsaSl7WSghMCxiLkhvdXJnbGFzcyx0LGUsaSl9LGNpcmNsZTpmdW5jdGlvbih0LGUsaSl7WSghMCxiLkNpcmNsZSx0LGUsaSl9LGFycm93czpmdW5jdGlvbih0LGUsaSl7WSghMCxiLkFycm93cyx0LGUsaSl9LGRvdHM6ZnVuY3Rpb24odCxlLGkpe1koITAsYi5Eb3RzLHQsZSxpKX0scHVsc2U6ZnVuY3Rpb24odCxlLGkpe1koITAsYi5QdWxzZSx0LGUsaSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe1wibnVtYmVyXCIhPXR5cGVvZiBlJiYoZT0wKSxZKCExLG51bGwsdCxudWxsLG51bGwsZSl9fX07cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQuTm90aWZsaXg/dighMCx0Lk5vdGlmbGl4LHtOb3RpZnk6Ry5Ob3RpZnksUmVwb3J0OkcuUmVwb3J0LENvbmZpcm06Ry5Db25maXJtLExvYWRpbmc6Ry5Mb2FkaW5nLEJsb2NrOkcuQmxvY2t9KTp7Tm90aWZ5OkcuTm90aWZ5LFJlcG9ydDpHLlJlcG9ydCxDb25maXJtOkcuQ29uZmlybSxMb2FkaW5nOkcuTG9hZGluZyxCbG9jazpHLkJsb2NrfX0pOyIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG52YXIgcXVvdGVzID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAnZG91YmxlJzogJ1wiJyxcbiAgICBzaW5nbGU6IFwiJ1wiXG59O1xudmFyIHF1b3RlUkVzID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAnZG91YmxlJzogLyhbXCJcXFxcXSkvZyxcbiAgICBzaW5nbGU6IC8oWydcXFxcXSkvZ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnNwZWN0XyhvYmosIG9wdGlvbnMsIGRlcHRoLCBzZWVuKSB7XG4gICAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpICYmICFoYXMocXVvdGVzLCBvcHRzLnF1b3RlU3R5bGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcInF1b3RlU3R5bGVcIiBtdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJkb3VibGVcIicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnbWF4U3RyaW5nTGVuZ3RoJykgJiYgKHR5cGVvZiBvcHRzLm1heFN0cmluZ0xlbmd0aCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgID8gb3B0cy5tYXhTdHJpbmdMZW5ndGggPCAwICYmIG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBJbmZpbml0eVxuICAgICAgICAgICAgOiBvcHRzLm1heFN0cmluZ0xlbmd0aCAhPT0gbnVsbFxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm1heFN0cmluZ0xlbmd0aFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIEluZmluaXR5LCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbUluc3BlY3QgPSBoYXMob3B0cywgJ2N1c3RvbUluc3BlY3QnKSA/IG9wdHMuY3VzdG9tSW5zcGVjdCA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21JbnNwZWN0ICE9PSAnYm9vbGVhbicgJiYgY3VzdG9tSW5zcGVjdCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiY3VzdG9tSW5zcGVjdFwiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBgdHJ1ZWAsIGBmYWxzZWAsIG9yIGBcXCdzeW1ib2xcXCdgJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBoYXMob3B0cywgJ2luZGVudCcpXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSBudWxsXG4gICAgICAgICYmIG9wdHMuaW5kZW50ICE9PSAnXFx0J1xuICAgICAgICAmJiAhKHBhcnNlSW50KG9wdHMuaW5kZW50LCAxMCkgPT09IG9wdHMuaW5kZW50ICYmIG9wdHMuaW5kZW50ID4gMClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwiaW5kZW50XCIgbXVzdCBiZSBcIlxcXFx0XCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtcbiAgICB9XG4gICAgaWYgKGhhcyhvcHRzLCAnbnVtZXJpY1NlcGFyYXRvcicpICYmIHR5cGVvZiBvcHRzLm51bWVyaWNTZXBhcmF0b3IgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJudW1lcmljU2VwYXJhdG9yXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCBvciBgZmFsc2VgJyk7XG4gICAgfVxuICAgIHZhciBudW1lcmljU2VwYXJhdG9yID0gb3B0cy5udW1lcmljU2VwYXJhdG9yO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBvYmogPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZyhvYmosIG9wdHMpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKG9iaiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5IC8gb2JqID4gMCA/ICcwJyA6ICctMCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ciA9IFN0cmluZyhvYmopO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBzdHIpIDogc3RyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgdmFyIGJpZ0ludFN0ciA9IFN0cmluZyhvYmopICsgJ24nO1xuICAgICAgICByZXR1cm4gbnVtZXJpY1NlcGFyYXRvciA/IGFkZE51bWVyaWNTZXBhcmF0b3Iob2JqLCBiaWdJbnRTdHIpIDogYmlnSW50U3RyO1xuICAgIH1cblxuICAgIHZhciBtYXhEZXB0aCA9IHR5cGVvZiBvcHRzLmRlcHRoID09PSAndW5kZWZpbmVkJyA/IDUgOiBvcHRzLmRlcHRoO1xuICAgIGlmICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnKSB7IGRlcHRoID0gMDsgfVxuICAgIGlmIChkZXB0aCA+PSBtYXhEZXB0aCAmJiBtYXhEZXB0aCA+IDAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkob2JqKSA/ICdbQXJyYXldJyA6ICdbT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgdmFyIGluZGVudCA9IGdldEluZGVudChvcHRzLCBkZXB0aCk7XG5cbiAgICBpZiAodHlwZW9mIHNlZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlZW4gPSBbXTtcbiAgICB9IGVsc2UgaWYgKGluZGV4T2Yoc2Vlbiwgb2JqKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgZnJvbSwgbm9JbmRlbnQpIHtcbiAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICAgIHNlZW4gPSAkYXJyU2xpY2UuY2FsbChzZWVuKTtcbiAgICAgICAgICAgIHNlZW4ucHVzaChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9JbmRlbnQpIHtcbiAgICAgICAgICAgIHZhciBuZXdPcHRzID0ge1xuICAgICAgICAgICAgICAgIGRlcHRoOiBvcHRzLmRlcHRoXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGhhcyhvcHRzLCAncXVvdGVTdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgbmV3T3B0cy5xdW90ZVN0eWxlID0gb3B0cy5xdW90ZVN0eWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBuZXdPcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnNwZWN0Xyh2YWx1ZSwgb3B0cywgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWdFeHAob2JqKSkgeyAvLyBpbiBvbGRlciBlbmdpbmVzLCByZWdleGVzIGFyZSBjYWxsYWJsZVxuICAgICAgICB2YXIgbmFtZSA9IG5hbWVPZihvYmopO1xuICAgICAgICB2YXIga2V5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgcmV0dXJuICdbRnVuY3Rpb24nICsgKG5hbWUgPyAnOiAnICsgbmFtZSA6ICcgKGFub255bW91cyknKSArICddJyArIChrZXlzLmxlbmd0aCA+IDAgPyAnIHsgJyArICRqb2luLmNhbGwoa2V5cywgJywgJykgKyAnIH0nIDogJycpO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wob2JqKSkge1xuICAgICAgICB2YXIgc3ltU3RyaW5nID0gaGFzU2hhbW1lZFN5bWJvbHMgPyAkcmVwbGFjZS5jYWxsKFN0cmluZyhvYmopLCAvXihTeW1ib2xcXCguKlxcKSlfW14pXSokLywgJyQxJykgOiBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhaGFzU2hhbW1lZFN5bWJvbHMgPyBtYXJrQm94ZWQoc3ltU3RyaW5nKSA6IHN5bVN0cmluZztcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChvYmopKSB7XG4gICAgICAgIHZhciBzID0gJzwnICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpO1xuICAgICAgICB2YXIgYXR0cnMgPSBvYmouYXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcyArPSAnICcgKyBhdHRyc1tpXS5uYW1lICsgJz0nICsgd3JhcFF1b3RlcyhxdW90ZShhdHRyc1tpXS52YWx1ZSksICdkb3VibGUnLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBzICs9ICc+JztcbiAgICAgICAgaWYgKG9iai5jaGlsZE5vZGVzICYmIG9iai5jaGlsZE5vZGVzLmxlbmd0aCkgeyBzICs9ICcuLi4nOyB9XG4gICAgICAgIHMgKz0gJzwvJyArICR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKSArICc+JztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKG9iai5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbXSc7IH1cbiAgICAgICAgdmFyIHhzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICBpZiAoaW5kZW50ICYmICFzaW5nbGVMaW5lVmFsdWVzKHhzKSkge1xuICAgICAgICAgICAgcmV0dXJuICdbJyArIGluZGVudGVkSm9pbih4cywgaW5kZW50KSArICddJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1sgJyArICRqb2luLmNhbGwoeHMsICcsICcpICsgJyBdJztcbiAgICB9XG4gICAgaWYgKGlzRXJyb3Iob2JqKSkge1xuICAgICAgICB2YXIgcGFydHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmICghKCdjYXVzZScgaW4gRXJyb3IucHJvdG90eXBlKSAmJiAnY2F1c2UnIGluIG9iaiAmJiAhaXNFbnVtZXJhYmxlLmNhbGwob2JqLCAnY2F1c2UnKSkge1xuICAgICAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoJ1tjYXVzZV06ICcgKyBpbnNwZWN0KG9iai5jYXVzZSksIHBhcnRzKSwgJywgJykgKyAnIH0nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICdbJyArIFN0cmluZyhvYmopICsgJ10nOyB9XG4gICAgICAgIHJldHVybiAneyBbJyArIFN0cmluZyhvYmopICsgJ10gJyArICRqb2luLmNhbGwocGFydHMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIGN1c3RvbUluc3BlY3QpIHtcbiAgICAgICAgaWYgKGluc3BlY3RTeW1ib2wgJiYgdHlwZW9mIG9ialtpbnNwZWN0U3ltYm9sXSA9PT0gJ2Z1bmN0aW9uJyAmJiB1dGlsSW5zcGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxJbnNwZWN0KG9iaiwgeyBkZXB0aDogbWF4RGVwdGggLSBkZXB0aCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJyAmJiB0eXBlb2Ygb2JqLmluc3BlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmouaW5zcGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc01hcChvYmopKSB7XG4gICAgICAgIHZhciBtYXBQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAobWFwRm9yRWFjaCkge1xuICAgICAgICAgICAgbWFwRm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmosIHRydWUpICsgJyA9PiAnICsgaW5zcGVjdCh2YWx1ZSwgb2JqKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbk9mKCdNYXAnLCBtYXBTaXplLmNhbGwob2JqKSwgbWFwUGFydHMsIGluZGVudCk7XG4gICAgfVxuICAgIGlmIChpc1NldChvYmopKSB7XG4gICAgICAgIHZhciBzZXRQYXJ0cyA9IFtdO1xuICAgICAgICBpZiAoc2V0Rm9yRWFjaCkge1xuICAgICAgICAgICAgc2V0Rm9yRWFjaC5jYWxsKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0UGFydHMucHVzaChpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ1NldCcsIHNldFNpemUuY2FsbChvYmopLCBzZXRQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha01hcChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrTWFwJyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtTZXQob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1NldCcpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtSZWYnKTtcbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KE51bWJlcihvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ0ludChvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChib29sZWFuVmFsdWVPZi5jYWxsKG9iaikpO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoU3RyaW5nKG9iaikpKTtcbiAgICB9XG4gICAgLy8gbm90ZTogaW4gSUUgOCwgc29tZXRpbWVzIGBnbG9iYWwgIT09IHdpbmRvd2AgYnV0IGJvdGggYXJlIHRoZSBwcm90b3R5cGVzIG9mIGVhY2ggb3RoZXJcbiAgICAvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSB3aW5kb3cpIHtcbiAgICAgICAgcmV0dXJuICd7IFtvYmplY3QgV2luZG93XSB9JztcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gZ2xvYmFsVGhpcylcbiAgICAgICAgfHwgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIG9iaiA9PT0gZ2xvYmFsKVxuICAgICkge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBnbG9iYWxUaGlzXSB9JztcbiAgICB9XG4gICAgaWYgKCFpc0RhdGUob2JqKSAmJiAhaXNSZWdFeHAob2JqKSkge1xuICAgICAgICB2YXIgeXMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIHZhciBpc1BsYWluT2JqZWN0ID0gZ1BPID8gZ1BPKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGUgOiBvYmogaW5zdGFuY2VvZiBPYmplY3QgfHwgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG4gICAgICAgIHZhciBwcm90b1RhZyA9IG9iaiBpbnN0YW5jZW9mIE9iamVjdCA/ICcnIDogJ251bGwgcHJvdG90eXBlJztcbiAgICAgICAgdmFyIHN0cmluZ1RhZyA9ICFpc1BsYWluT2JqZWN0ICYmIHRvU3RyaW5nVGFnICYmIE9iamVjdChvYmopID09PSBvYmogJiYgdG9TdHJpbmdUYWcgaW4gb2JqID8gJHNsaWNlLmNhbGwodG9TdHIob2JqKSwgOCwgLTEpIDogcHJvdG9UYWcgPyAnT2JqZWN0JyA6ICcnO1xuICAgICAgICB2YXIgY29uc3RydWN0b3JUYWcgPSBpc1BsYWluT2JqZWN0IHx8IHR5cGVvZiBvYmouY29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicgPyAnJyA6IG9iai5jb25zdHJ1Y3Rvci5uYW1lID8gb2JqLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgOiAnJztcbiAgICAgICAgdmFyIHRhZyA9IGNvbnN0cnVjdG9yVGFnICsgKHN0cmluZ1RhZyB8fCBwcm90b1RhZyA/ICdbJyArICRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKFtdLCBzdHJpbmdUYWcgfHwgW10sIHByb3RvVGFnIHx8IFtdKSwgJzogJykgKyAnXSAnIDogJycpO1xuICAgICAgICBpZiAoeXMubGVuZ3RoID09PSAwKSB7IHJldHVybiB0YWcgKyAne30nOyB9XG4gICAgICAgIGlmIChpbmRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWcgKyAneycgKyBpbmRlbnRlZEpvaW4oeXMsIGluZGVudCkgKyAnfSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZyArICd7ICcgKyAkam9pbi5jYWxsKHlzLCAnLCAnKSArICcgfSc7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob2JqKTtcbn07XG5cbmZ1bmN0aW9uIHdyYXBRdW90ZXMocywgZGVmYXVsdFN0eWxlLCBvcHRzKSB7XG4gICAgdmFyIHN0eWxlID0gb3B0cy5xdW90ZVN0eWxlIHx8IGRlZmF1bHRTdHlsZTtcbiAgICB2YXIgcXVvdGVDaGFyID0gcXVvdGVzW3N0eWxlXTtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gY2FuVHJ1c3RUb1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgKHRvU3RyaW5nVGFnIGluIG9iaiB8fCB0eXBlb2Ygb2JqW3RvU3RyaW5nVGFnXSAhPT0gJ3VuZGVmaW5lZCcpKTtcbn1cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBBcnJheV0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNEYXRlKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBSZWdFeHBdJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cbmZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBFcnJvcl0nICYmIGNhblRydXN0VG9TdHJpbmcob2JqKTsgfVxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBTdHJpbmddJyAmJiBjYW5UcnVzdFRvU3RyaW5nKG9iaik7IH1cbmZ1bmN0aW9uIGlzTnVtYmVyKG9iaikgeyByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBCb29sZWFuXScgJiYgY2FuVHJ1c3RUb1N0cmluZyhvYmopOyB9XG5cbi8vIFN5bWJvbCBhbmQgQmlnSW50IGRvIGhhdmUgU3ltYm9sLnRvU3RyaW5nVGFnIGJ5IHNwZWMsIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCB0byBlbGltaW5hdGUgZmFsc2UgcG9zaXRpdmVzXG5mdW5jdGlvbiBpc1N5bWJvbChvYmopIHtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBTeW1ib2w7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIXN5bVRvU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3ltVG9TdHJpbmcuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIWJpZ0ludFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5IHx8IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSBpbiB0aGlzOyB9O1xuZnVuY3Rpb24gaGFzKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn1cblxuZnVuY3Rpb24gdG9TdHIob2JqKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvU3RyaW5nLmNhbGwob2JqKTtcbn1cblxuZnVuY3Rpb24gbmFtZU9mKGYpIHtcbiAgICBpZiAoZi5uYW1lKSB7IHJldHVybiBmLm5hbWU7IH1cbiAgICB2YXIgbSA9ICRtYXRjaC5jYWxsKGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChmKSwgL15mdW5jdGlvblxccyooW1xcdyRdKykvKTtcbiAgICBpZiAobSkgeyByZXR1cm4gbVsxXTsgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gICAgaWYgKHhzLmluZGV4T2YpIHsgcmV0dXJuIHhzLmluZGV4T2YoeCk7IH1cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoeHNbaV0gPT09IHgpIHsgcmV0dXJuIGk7IH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc01hcCh4KSB7XG4gICAgaWYgKCFtYXBTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBNYXA7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtNYXAoeCkge1xuICAgIGlmICghd2Vha01hcEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha01hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1JlZih4KSB7XG4gICAgaWYgKCF3ZWFrUmVmRGVyZWYgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2Vha1JlZkRlcmVmLmNhbGwoeCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1NldCh4KSB7XG4gICAgaWYgKCFzZXRTaXplIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHNldFNpemUuY2FsbCh4KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1hcFNpemUuY2FsbCh4KTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBTZXQ7IC8vIGNvcmUtanMgd29ya2Fyb3VuZCwgcHJlLXYyLjUuMFxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1dlYWtTZXQoeCkge1xuICAgIGlmICghd2Vha1NldEhhcyB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrU2V0SGFzLmNhbGwoeCwgd2Vha1NldEhhcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3ZWFrTWFwSGFzLmNhbGwoeCwgd2Vha01hcEhhcyk7XG4gICAgICAgIH0gY2F0Y2ggKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4IGluc3RhbmNlb2YgV2Vha1NldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCh4KSB7XG4gICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgeC5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHguZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0ciwgb3B0cykge1xuICAgIGlmIChzdHIubGVuZ3RoID4gb3B0cy5tYXhTdHJpbmdMZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHN0ci5sZW5ndGggLSBvcHRzLm1heFN0cmluZ0xlbmd0aDtcbiAgICAgICAgdmFyIHRyYWlsZXIgPSAnLi4uICcgKyByZW1haW5pbmcgKyAnIG1vcmUgY2hhcmFjdGVyJyArIChyZW1haW5pbmcgPiAxID8gJ3MnIDogJycpO1xuICAgICAgICByZXR1cm4gaW5zcGVjdFN0cmluZygkc2xpY2UuY2FsbChzdHIsIDAsIG9wdHMubWF4U3RyaW5nTGVuZ3RoKSwgb3B0cykgKyB0cmFpbGVyO1xuICAgIH1cbiAgICB2YXIgcXVvdGVSRSA9IHF1b3RlUkVzW29wdHMucXVvdGVTdHlsZSB8fCAnc2luZ2xlJ107XG4gICAgcXVvdGVSRS5sYXN0SW5kZXggPSAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCBxdW90ZVJFLCAnXFxcXCQxJyksIC9bXFx4MDAtXFx4MWZdL2csIGxvd2J5dGUpO1xuICAgIHJldHVybiB3cmFwUXVvdGVzKHMsICdzaW5nbGUnLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gbG93Ynl0ZShjKSB7XG4gICAgdmFyIG4gPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHggPSB7XG4gICAgICAgIDg6ICdiJyxcbiAgICAgICAgOTogJ3QnLFxuICAgICAgICAxMDogJ24nLFxuICAgICAgICAxMjogJ2YnLFxuICAgICAgICAxMzogJ3InXG4gICAgfVtuXTtcbiAgICBpZiAoeCkgeyByZXR1cm4gJ1xcXFwnICsgeDsgfVxuICAgIHJldHVybiAnXFxcXHgnICsgKG4gPCAweDEwID8gJzAnIDogJycpICsgJHRvVXBwZXJDYXNlLmNhbGwobi50b1N0cmluZygxNikpO1xufVxuXG5mdW5jdGlvbiBtYXJrQm94ZWQoc3RyKSB7XG4gICAgcmV0dXJuICdPYmplY3QoJyArIHN0ciArICcpJztcbn1cblxuZnVuY3Rpb24gd2Vha0NvbGxlY3Rpb25PZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgKyAnIHsgPyB9Jztcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbk9mKHR5cGUsIHNpemUsIGVudHJpZXMsIGluZGVudCkge1xuICAgIHZhciBqb2luZWRFbnRyaWVzID0gaW5kZW50ID8gaW5kZW50ZWRKb2luKGVudHJpZXMsIGluZGVudCkgOiAkam9pbi5jYWxsKGVudHJpZXMsICcsICcpO1xuICAgIHJldHVybiB0eXBlICsgJyAoJyArIHNpemUgKyAnKSB7JyArIGpvaW5lZEVudHJpZXMgKyAnfSc7XG59XG5cbmZ1bmN0aW9uIHNpbmdsZUxpbmVWYWx1ZXMoeHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbmRleE9mKHhzW2ldLCAnXFxuJykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRJbmRlbnQob3B0cywgZGVwdGgpIHtcbiAgICB2YXIgYmFzZUluZGVudDtcbiAgICBpZiAob3B0cy5pbmRlbnQgPT09ICdcXHQnKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAnXFx0JztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRzLmluZGVudCA9PT0gJ251bWJlcicgJiYgb3B0cy5pbmRlbnQgPiAwKSB7XG4gICAgICAgIGJhc2VJbmRlbnQgPSAkam9pbi5jYWxsKEFycmF5KG9wdHMuaW5kZW50ICsgMSksICcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGJhc2VJbmRlbnQsXG4gICAgICAgIHByZXY6ICRqb2luLmNhbGwoQXJyYXkoZGVwdGggKyAxKSwgYmFzZUluZGVudClcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBpbmRlbnRlZEpvaW4oeHMsIGluZGVudCkge1xuICAgIGlmICh4cy5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gICAgdmFyIGxpbmVKb2luZXIgPSAnXFxuJyArIGluZGVudC5wcmV2ICsgaW5kZW50LmJhc2U7XG4gICAgcmV0dXJuIGxpbmVKb2luZXIgKyAkam9pbi5jYWxsKHhzLCAnLCcgKyBsaW5lSm9pbmVyKSArICdcXG4nICsgaW5kZW50LnByZXY7XG59XG5cbmZ1bmN0aW9uIGFyck9iaktleXMob2JqLCBpbnNwZWN0KSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmopO1xuICAgIHZhciB4cyA9IFtdO1xuICAgIGlmIChpc0Fycikge1xuICAgICAgICB4cy5sZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeHNbaV0gPSBoYXMob2JqLCBpKSA/IGluc3BlY3Qob2JqW2ldLCBvYmopIDogJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN5bXMgPSB0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJyA/IGdPUFMob2JqKSA6IFtdO1xuICAgIHZhciBzeW1NYXA7XG4gICAgaWYgKGhhc1NoYW1tZWRTeW1ib2xzKSB7XG4gICAgICAgIHN5bU1hcCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHN5bXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHN5bU1hcFsnJCcgKyBzeW1zW2tdXSA9IHN5bXNba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgaWYgKCFoYXMob2JqLCBrZXkpKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChpc0FyciAmJiBTdHJpbmcoTnVtYmVyKGtleSkpID09PSBrZXkgJiYga2V5IDwgb2JqLmxlbmd0aCkgeyBjb250aW51ZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMgJiYgc3ltTWFwWyckJyArIGtleV0gaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBzaGFtbWVkIFN5bWJvbHMsIHdoaWNoIGFyZSBzdG9yZWQgYXMgc3RyaW5ncywgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIGtleSBzZWN0aW9uXG4gICAgICAgICAgICBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmICgkdGVzdC5jYWxsKC9bXlxcdyRdLywga2V5KSkge1xuICAgICAgICAgICAgeHMucHVzaChpbnNwZWN0KGtleSwgb2JqKSArICc6ICcgKyBpbnNwZWN0KG9ialtrZXldLCBvYmopKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhzLnB1c2goa2V5ICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ09QUyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN5bXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VudW1lcmFibGUuY2FsbChvYmosIHN5bXNbal0pKSB7XG4gICAgICAgICAgICAgICAgeHMucHVzaCgnWycgKyBpbnNwZWN0KHN5bXNbal0pICsgJ106ICcgKyBpbnNwZWN0KG9ialtzeW1zW2pdXSwgb2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHhzO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL2xpYi9oYXMnKTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkgeyAvKiovIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgK1xuICAgICAgICAgICAgICAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL2xpYi9oYXMnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJpZ2ludDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2JpZ2ludCcpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGVsZW1lbnRUeXBlOiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlLCBkYXRhKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGE6IHt9O1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJyArIHByb3BGdWxsTmFtZSArICdgIHByb3Agb24gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpLFxuICAgICAgICAgIHtleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZX1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFSZWFjdElzLmlzVmFsaWRFbGVtZW50VHlwZShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheSwgZ290ICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMuICcgK1xuICAgICAgICAgICAgJ0EgY29tbW9uIG1pc3Rha2UgaXMgdG8gd3JpdGUgb25lT2YoeCwgeSwgeikgaW5zdGVhZCBvZiBvbmVPZihbeCwgeSwgel0pLidcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXkuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzLCBmdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBTdHJpbmcocHJvcFZhbHVlKSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAoaGFzKHByb3BWYWx1ZSwga2V5KSkge1xuICAgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJyArIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSArICcgYXQgaW5kZXggJyArIGkgKyAnLidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgdmFyIGNoZWNrZXJSZXN1bHQgPSBjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQuZGF0YSAmJiBoYXMoY2hlY2tlclJlc3VsdC5kYXRhLCAnZXhwZWN0ZWRUeXBlJykpIHtcbiAgICAgICAgICBleHBlY3RlZFR5cGVzLnB1c2goY2hlY2tlclJlc3VsdC5kYXRhLmV4cGVjdGVkVHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBleHBlY3RlZFR5cGVzTWVzc2FnZSA9IChleHBlY3RlZFR5cGVzLmxlbmd0aCA+IDApID8gJywgZXhwZWN0ZWQgb25lIG9mIHR5cGUgWycgKyBleHBlY3RlZFR5cGVzLmpvaW4oJywgJykgKyAnXSc6ICcnO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCcgKyBleHBlY3RlZFR5cGVzTWVzc2FnZSArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgdHlwZSkge1xuICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5ICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlICsgJ2AuJ1xuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFsbCBrZXlzIGluIGNhc2Ugc29tZSBhcmUgcmVxdWlyZWQgYnV0IG1pc3NpbmcgZnJvbSBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmIChoYXMoc2hhcGVUeXBlcywga2V5KSAmJiB0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGtleSBgJyArIGtleSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLicgK1xuICAgICAgICAgICAgJ1xcbkJhZCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShwcm9wc1twcm9wTmFtZV0sIG51bGwsICcgICcpICtcbiAgICAgICAgICAgICdcXG5WYWxpZCBrZXlzOiAnICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2hhcGVUeXBlcyksIG51bGwsICcgICcpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZmFsc3kgdmFsdWUgY2FuJ3QgYmUgYSBTeW1ib2xcbiAgICBpZiAoIXByb3BWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGU7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX29ialJlc3QgPSAoc291cmNlLCBleGNsdWRlKSA9PiB7XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKHNvdXJjZSwgcHJvcCkgJiYgZXhjbHVkZS5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgaWYgKHNvdXJjZSAhPSBudWxsICYmIF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKHNvdXJjZSkpIHtcbiAgICAgIGlmIChleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwICYmIF9fcHJvcElzRW51bS5jYWxsKHNvdXJjZSwgcHJvcCkpXG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICB9XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG4vLyBzcmMvaW5kZXgudHN4XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8vIHNyYy90aGlyZC1wYXJ0eS9xcmNvZGVnZW4vaW5kZXgudHNcbi8qKlxuICogQGxpY2Vuc2UgUVIgQ29kZSBnZW5lcmF0b3IgbGlicmFyeSAoVHlwZVNjcmlwdClcbiAqIENvcHlyaWdodCAoYykgUHJvamVjdCBOYXl1a2kuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4gKi9cbnZhciBxcmNvZGVnZW47XG4oKHFyY29kZWdlbjIpID0+IHtcbiAgY29uc3QgX1FyQ29kZSA9IGNsYXNzIF9RckNvZGUge1xuICAgIC8qLS0gQ29uc3RydWN0b3IgKGxvdyBsZXZlbCkgYW5kIGZpZWxkcyAtLSovXG4gICAgLy8gQ3JlYXRlcyBhIG5ldyBRUiBDb2RlIHdpdGggdGhlIGdpdmVuIHZlcnNpb24gbnVtYmVyLFxuICAgIC8vIGVycm9yIGNvcnJlY3Rpb24gbGV2ZWwsIGRhdGEgY29kZXdvcmQgYnl0ZXMsIGFuZCBtYXNrIG51bWJlci5cbiAgICAvLyBUaGlzIGlzIGEgbG93LWxldmVsIEFQSSB0aGF0IG1vc3QgdXNlcnMgc2hvdWxkIG5vdCB1c2UgZGlyZWN0bHkuXG4gICAgLy8gQSBtaWQtbGV2ZWwgQVBJIGlzIHRoZSBlbmNvZGVTZWdtZW50cygpIGZ1bmN0aW9uLlxuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24sIGVycm9yQ29ycmVjdGlvbkxldmVsLCBkYXRhQ29kZXdvcmRzLCBtc2spIHtcbiAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICB0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsID0gZXJyb3JDb3JyZWN0aW9uTGV2ZWw7XG4gICAgICAvLyBUaGUgbW9kdWxlcyBvZiB0aGlzIFFSIENvZGUgKGZhbHNlID0gbGlnaHQsIHRydWUgPSBkYXJrKS5cbiAgICAgIC8vIEltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvciBmaW5pc2hlcy4gQWNjZXNzZWQgdGhyb3VnaCBnZXRNb2R1bGUoKS5cbiAgICAgIHRoaXMubW9kdWxlcyA9IFtdO1xuICAgICAgLy8gSW5kaWNhdGVzIGZ1bmN0aW9uIG1vZHVsZXMgdGhhdCBhcmUgbm90IHN1YmplY3RlZCB0byBtYXNraW5nLiBEaXNjYXJkZWQgd2hlbiBjb25zdHJ1Y3RvciBmaW5pc2hlcy5cbiAgICAgIHRoaXMuaXNGdW5jdGlvbiA9IFtdO1xuICAgICAgaWYgKHZlcnNpb24gPCBfUXJDb2RlLk1JTl9WRVJTSU9OIHx8IHZlcnNpb24gPiBfUXJDb2RlLk1BWF9WRVJTSU9OKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZlcnNpb24gdmFsdWUgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgaWYgKG1zayA8IC0xIHx8IG1zayA+IDcpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFzayB2YWx1ZSBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICB0aGlzLnNpemUgPSB2ZXJzaW9uICogNCArIDE3O1xuICAgICAgbGV0IHJvdyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKylcbiAgICAgICAgcm93LnB1c2goZmFsc2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICB0aGlzLm1vZHVsZXMucHVzaChyb3cuc2xpY2UoKSk7XG4gICAgICAgIHRoaXMuaXNGdW5jdGlvbi5wdXNoKHJvdy5zbGljZSgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhd0Z1bmN0aW9uUGF0dGVybnMoKTtcbiAgICAgIGNvbnN0IGFsbENvZGV3b3JkcyA9IHRoaXMuYWRkRWNjQW5kSW50ZXJsZWF2ZShkYXRhQ29kZXdvcmRzKTtcbiAgICAgIHRoaXMuZHJhd0NvZGV3b3JkcyhhbGxDb2Rld29yZHMpO1xuICAgICAgaWYgKG1zayA9PSAtMSkge1xuICAgICAgICBsZXQgbWluUGVuYWx0eSA9IDFlOTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICB0aGlzLmFwcGx5TWFzayhpKTtcbiAgICAgICAgICB0aGlzLmRyYXdGb3JtYXRCaXRzKGkpO1xuICAgICAgICAgIGNvbnN0IHBlbmFsdHkgPSB0aGlzLmdldFBlbmFsdHlTY29yZSgpO1xuICAgICAgICAgIGlmIChwZW5hbHR5IDwgbWluUGVuYWx0eSkge1xuICAgICAgICAgICAgbXNrID0gaTtcbiAgICAgICAgICAgIG1pblBlbmFsdHkgPSBwZW5hbHR5O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFwcGx5TWFzayhpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXNzZXJ0KDAgPD0gbXNrICYmIG1zayA8PSA3KTtcbiAgICAgIHRoaXMubWFzayA9IG1zaztcbiAgICAgIHRoaXMuYXBwbHlNYXNrKG1zayk7XG4gICAgICB0aGlzLmRyYXdGb3JtYXRCaXRzKG1zayk7XG4gICAgICB0aGlzLmlzRnVuY3Rpb24gPSBbXTtcbiAgICB9XG4gICAgLyotLSBTdGF0aWMgZmFjdG9yeSBmdW5jdGlvbnMgKGhpZ2ggbGV2ZWwpIC0tKi9cbiAgICAvLyBSZXR1cm5zIGEgUVIgQ29kZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIFVuaWNvZGUgdGV4dCBzdHJpbmcgYXQgdGhlIGdpdmVuIGVycm9yIGNvcnJlY3Rpb24gbGV2ZWwuXG4gICAgLy8gQXMgYSBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQsIHRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGZvciBzdHJpbmdzIHRoYXQgaGF2ZSA3Mzggb3IgZmV3ZXJcbiAgICAvLyBVbmljb2RlIGNvZGUgcG9pbnRzIChub3QgVVRGLTE2IGNvZGUgdW5pdHMpIGlmIHRoZSBsb3cgZXJyb3IgY29ycmVjdGlvbiBsZXZlbCBpcyB1c2VkLiBUaGUgc21hbGxlc3QgcG9zc2libGVcbiAgICAvLyBRUiBDb2RlIHZlcnNpb24gaXMgYXV0b21hdGljYWxseSBjaG9zZW4gZm9yIHRoZSBvdXRwdXQuIFRoZSBFQ0MgbGV2ZWwgb2YgdGhlIHJlc3VsdCBtYXkgYmUgaGlnaGVyIHRoYW4gdGhlXG4gICAgLy8gZWNsIGFyZ3VtZW50IGlmIGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgdmVyc2lvbi5cbiAgICBzdGF0aWMgZW5jb2RlVGV4dCh0ZXh0LCBlY2wpIHtcbiAgICAgIGNvbnN0IHNlZ3MgPSBxcmNvZGVnZW4yLlFyU2VnbWVudC5tYWtlU2VnbWVudHModGV4dCk7XG4gICAgICByZXR1cm4gX1FyQ29kZS5lbmNvZGVTZWdtZW50cyhzZWdzLCBlY2wpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgUVIgQ29kZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpbmFyeSBkYXRhIGF0IHRoZSBnaXZlbiBlcnJvciBjb3JyZWN0aW9uIGxldmVsLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGVuY29kZXMgdXNpbmcgdGhlIGJpbmFyeSBzZWdtZW50IG1vZGUsIG5vdCBhbnkgdGV4dCBtb2RlLiBUaGUgbWF4aW11bSBudW1iZXIgb2ZcbiAgICAvLyBieXRlcyBhbGxvd2VkIGlzIDI5NTMuIFRoZSBzbWFsbGVzdCBwb3NzaWJsZSBRUiBDb2RlIHZlcnNpb24gaXMgYXV0b21hdGljYWxseSBjaG9zZW4gZm9yIHRoZSBvdXRwdXQuXG4gICAgLy8gVGhlIEVDQyBsZXZlbCBvZiB0aGUgcmVzdWx0IG1heSBiZSBoaWdoZXIgdGhhbiB0aGUgZWNsIGFyZ3VtZW50IGlmIGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgdmVyc2lvbi5cbiAgICBzdGF0aWMgZW5jb2RlQmluYXJ5KGRhdGEsIGVjbCkge1xuICAgICAgY29uc3Qgc2VnID0gcXJjb2RlZ2VuMi5RclNlZ21lbnQubWFrZUJ5dGVzKGRhdGEpO1xuICAgICAgcmV0dXJuIF9RckNvZGUuZW5jb2RlU2VnbWVudHMoW3NlZ10sIGVjbCk7XG4gICAgfVxuICAgIC8qLS0gU3RhdGljIGZhY3RvcnkgZnVuY3Rpb25zIChtaWQgbGV2ZWwpIC0tKi9cbiAgICAvLyBSZXR1cm5zIGEgUVIgQ29kZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHNlZ21lbnRzIHdpdGggdGhlIGdpdmVuIGVuY29kaW5nIHBhcmFtZXRlcnMuXG4gICAgLy8gVGhlIHNtYWxsZXN0IHBvc3NpYmxlIFFSIENvZGUgdmVyc2lvbiB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlIGlzIGF1dG9tYXRpY2FsbHlcbiAgICAvLyBjaG9zZW4gZm9yIHRoZSBvdXRwdXQuIElmZiBib29zdEVjbCBpcyB0cnVlLCB0aGVuIHRoZSBFQ0MgbGV2ZWwgb2YgdGhlIHJlc3VsdFxuICAgIC8vIG1heSBiZSBoaWdoZXIgdGhhbiB0aGUgZWNsIGFyZ3VtZW50IGlmIGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgaW5jcmVhc2luZyB0aGVcbiAgICAvLyB2ZXJzaW9uLiBUaGUgbWFzayBudW1iZXIgaXMgZWl0aGVyIGJldHdlZW4gMCB0byA3IChpbmNsdXNpdmUpIHRvIGZvcmNlIHRoYXRcbiAgICAvLyBtYXNrLCBvciAtMSB0byBhdXRvbWF0aWNhbGx5IGNob29zZSBhbiBhcHByb3ByaWF0ZSBtYXNrICh3aGljaCBtYXkgYmUgc2xvdykuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlIGEgY3VzdG9tIHNlcXVlbmNlIG9mIHNlZ21lbnRzIHRoYXQgc3dpdGNoZXNcbiAgICAvLyBiZXR3ZWVuIG1vZGVzIChzdWNoIGFzIGFscGhhbnVtZXJpYyBhbmQgYnl0ZSkgdG8gZW5jb2RlIHRleHQgaW4gbGVzcyBzcGFjZS5cbiAgICAvLyBUaGlzIGlzIGEgbWlkLWxldmVsIEFQSTsgdGhlIGhpZ2gtbGV2ZWwgQVBJIGlzIGVuY29kZVRleHQoKSBhbmQgZW5jb2RlQmluYXJ5KCkuXG4gICAgc3RhdGljIGVuY29kZVNlZ21lbnRzKHNlZ3MsIGVjbCwgbWluVmVyc2lvbiA9IDEsIG1heFZlcnNpb24gPSA0MCwgbWFzayA9IC0xLCBib29zdEVjbCA9IHRydWUpIHtcbiAgICAgIGlmICghKF9RckNvZGUuTUlOX1ZFUlNJT04gPD0gbWluVmVyc2lvbiAmJiBtaW5WZXJzaW9uIDw9IG1heFZlcnNpb24gJiYgbWF4VmVyc2lvbiA8PSBfUXJDb2RlLk1BWF9WRVJTSU9OKSB8fCBtYXNrIDwgLTEgfHwgbWFzayA+IDcpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB2YWx1ZVwiKTtcbiAgICAgIGxldCB2ZXJzaW9uO1xuICAgICAgbGV0IGRhdGFVc2VkQml0cztcbiAgICAgIGZvciAodmVyc2lvbiA9IG1pblZlcnNpb247IDsgdmVyc2lvbisrKSB7XG4gICAgICAgIGNvbnN0IGRhdGFDYXBhY2l0eUJpdHMyID0gX1FyQ29kZS5nZXROdW1EYXRhQ29kZXdvcmRzKHZlcnNpb24sIGVjbCkgKiA4O1xuICAgICAgICBjb25zdCB1c2VkQml0cyA9IFFyU2VnbWVudC5nZXRUb3RhbEJpdHMoc2VncywgdmVyc2lvbik7XG4gICAgICAgIGlmICh1c2VkQml0cyA8PSBkYXRhQ2FwYWNpdHlCaXRzMikge1xuICAgICAgICAgIGRhdGFVc2VkQml0cyA9IHVzZWRCaXRzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2ZXJzaW9uID49IG1heFZlcnNpb24pXG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEYXRhIHRvbyBsb25nXCIpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBuZXdFY2wgb2YgW19RckNvZGUuRWNjLk1FRElVTSwgX1FyQ29kZS5FY2MuUVVBUlRJTEUsIF9RckNvZGUuRWNjLkhJR0hdKSB7XG4gICAgICAgIGlmIChib29zdEVjbCAmJiBkYXRhVXNlZEJpdHMgPD0gX1FyQ29kZS5nZXROdW1EYXRhQ29kZXdvcmRzKHZlcnNpb24sIG5ld0VjbCkgKiA4KVxuICAgICAgICAgIGVjbCA9IG5ld0VjbDtcbiAgICAgIH1cbiAgICAgIGxldCBiYiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgICAgICBhcHBlbmRCaXRzKHNlZy5tb2RlLm1vZGVCaXRzLCA0LCBiYik7XG4gICAgICAgIGFwcGVuZEJpdHMoc2VnLm51bUNoYXJzLCBzZWcubW9kZS5udW1DaGFyQ291bnRCaXRzKHZlcnNpb24pLCBiYik7XG4gICAgICAgIGZvciAoY29uc3QgYiBvZiBzZWcuZ2V0RGF0YSgpKVxuICAgICAgICAgIGJiLnB1c2goYik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoYmIubGVuZ3RoID09IGRhdGFVc2VkQml0cyk7XG4gICAgICBjb25zdCBkYXRhQ2FwYWNpdHlCaXRzID0gX1FyQ29kZS5nZXROdW1EYXRhQ29kZXdvcmRzKHZlcnNpb24sIGVjbCkgKiA4O1xuICAgICAgYXNzZXJ0KGJiLmxlbmd0aCA8PSBkYXRhQ2FwYWNpdHlCaXRzKTtcbiAgICAgIGFwcGVuZEJpdHMoMCwgTWF0aC5taW4oNCwgZGF0YUNhcGFjaXR5Qml0cyAtIGJiLmxlbmd0aCksIGJiKTtcbiAgICAgIGFwcGVuZEJpdHMoMCwgKDggLSBiYi5sZW5ndGggJSA4KSAlIDgsIGJiKTtcbiAgICAgIGFzc2VydChiYi5sZW5ndGggJSA4ID09IDApO1xuICAgICAgZm9yIChsZXQgcGFkQnl0ZSA9IDIzNjsgYmIubGVuZ3RoIDwgZGF0YUNhcGFjaXR5Qml0czsgcGFkQnl0ZSBePSAyMzYgXiAxNylcbiAgICAgICAgYXBwZW5kQml0cyhwYWRCeXRlLCA4LCBiYik7XG4gICAgICBsZXQgZGF0YUNvZGV3b3JkcyA9IFtdO1xuICAgICAgd2hpbGUgKGRhdGFDb2Rld29yZHMubGVuZ3RoICogOCA8IGJiLmxlbmd0aClcbiAgICAgICAgZGF0YUNvZGV3b3Jkcy5wdXNoKDApO1xuICAgICAgYmIuZm9yRWFjaCgoYiwgaSkgPT4gZGF0YUNvZGV3b3Jkc1tpID4+PiAzXSB8PSBiIDw8IDcgLSAoaSAmIDcpKTtcbiAgICAgIHJldHVybiBuZXcgX1FyQ29kZSh2ZXJzaW9uLCBlY2wsIGRhdGFDb2Rld29yZHMsIG1hc2spO1xuICAgIH1cbiAgICAvKi0tIEFjY2Vzc29yIG1ldGhvZHMgLS0qL1xuICAgIC8vIFJldHVybnMgdGhlIGNvbG9yIG9mIHRoZSBtb2R1bGUgKHBpeGVsKSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMsIHdoaWNoIGlzIGZhbHNlXG4gICAgLy8gZm9yIGxpZ2h0IG9yIHRydWUgZm9yIGRhcmsuIFRoZSB0b3AgbGVmdCBjb3JuZXIgaGFzIHRoZSBjb29yZGluYXRlcyAoeD0wLCB5PTApLlxuICAgIC8vIElmIHRoZSBnaXZlbiBjb29yZGluYXRlcyBhcmUgb3V0IG9mIGJvdW5kcywgdGhlbiBmYWxzZSAobGlnaHQpIGlzIHJldHVybmVkLlxuICAgIGdldE1vZHVsZSh4LCB5KSB7XG4gICAgICByZXR1cm4gMCA8PSB4ICYmIHggPCB0aGlzLnNpemUgJiYgMCA8PSB5ICYmIHkgPCB0aGlzLnNpemUgJiYgdGhpcy5tb2R1bGVzW3ldW3hdO1xuICAgIH1cbiAgICAvLyBNb2RpZmllZCB0byBleHBvc2UgbW9kdWxlcyBmb3IgZWFzeSBhY2Nlc3NcbiAgICBnZXRNb2R1bGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kdWxlcztcbiAgICB9XG4gICAgLyotLSBQcml2YXRlIGhlbHBlciBtZXRob2RzIGZvciBjb25zdHJ1Y3RvcjogRHJhd2luZyBmdW5jdGlvbiBtb2R1bGVzIC0tKi9cbiAgICAvLyBSZWFkcyB0aGlzIG9iamVjdCdzIHZlcnNpb24gZmllbGQsIGFuZCBkcmF3cyBhbmQgbWFya3MgYWxsIGZ1bmN0aW9uIG1vZHVsZXMuXG4gICAgZHJhd0Z1bmN0aW9uUGF0dGVybnMoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUoNiwgaSwgaSAlIDIgPT0gMCk7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUoaSwgNiwgaSAlIDIgPT0gMCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRyYXdGaW5kZXJQYXR0ZXJuKDMsIDMpO1xuICAgICAgdGhpcy5kcmF3RmluZGVyUGF0dGVybih0aGlzLnNpemUgLSA0LCAzKTtcbiAgICAgIHRoaXMuZHJhd0ZpbmRlclBhdHRlcm4oMywgdGhpcy5zaXplIC0gNCk7XG4gICAgICBjb25zdCBhbGlnblBhdFBvcyA9IHRoaXMuZ2V0QWxpZ25tZW50UGF0dGVyblBvc2l0aW9ucygpO1xuICAgICAgY29uc3QgbnVtQWxpZ24gPSBhbGlnblBhdFBvcy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUFsaWduOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1BbGlnbjsgaisrKSB7XG4gICAgICAgICAgaWYgKCEoaSA9PSAwICYmIGogPT0gMCB8fCBpID09IDAgJiYgaiA9PSBudW1BbGlnbiAtIDEgfHwgaSA9PSBudW1BbGlnbiAtIDEgJiYgaiA9PSAwKSlcbiAgICAgICAgICAgIHRoaXMuZHJhd0FsaWdubWVudFBhdHRlcm4oYWxpZ25QYXRQb3NbaV0sIGFsaWduUGF0UG9zW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kcmF3Rm9ybWF0Qml0cygwKTtcbiAgICAgIHRoaXMuZHJhd1ZlcnNpb24oKTtcbiAgICB9XG4gICAgLy8gRHJhd3MgdHdvIGNvcGllcyBvZiB0aGUgZm9ybWF0IGJpdHMgKHdpdGggaXRzIG93biBlcnJvciBjb3JyZWN0aW9uIGNvZGUpXG4gICAgLy8gYmFzZWQgb24gdGhlIGdpdmVuIG1hc2sgYW5kIHRoaXMgb2JqZWN0J3MgZXJyb3IgY29ycmVjdGlvbiBsZXZlbCBmaWVsZC5cbiAgICBkcmF3Rm9ybWF0Qml0cyhtYXNrKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbC5mb3JtYXRCaXRzIDw8IDMgfCBtYXNrO1xuICAgICAgbGV0IHJlbSA9IGRhdGE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspXG4gICAgICAgIHJlbSA9IHJlbSA8PCAxIF4gKHJlbSA+Pj4gOSkgKiAxMzM1O1xuICAgICAgY29uc3QgYml0cyA9IChkYXRhIDw8IDEwIHwgcmVtKSBeIDIxNTIyO1xuICAgICAgYXNzZXJ0KGJpdHMgPj4+IDE1ID09IDApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gNTsgaSsrKVxuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uTW9kdWxlKDgsIGksIGdldEJpdChiaXRzLCBpKSk7XG4gICAgICB0aGlzLnNldEZ1bmN0aW9uTW9kdWxlKDgsIDcsIGdldEJpdChiaXRzLCA2KSk7XG4gICAgICB0aGlzLnNldEZ1bmN0aW9uTW9kdWxlKDgsIDgsIGdldEJpdChiaXRzLCA3KSk7XG4gICAgICB0aGlzLnNldEZ1bmN0aW9uTW9kdWxlKDcsIDgsIGdldEJpdChiaXRzLCA4KSk7XG4gICAgICBmb3IgKGxldCBpID0gOTsgaSA8IDE1OyBpKyspXG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUoMTQgLSBpLCA4LCBnZXRCaXQoYml0cywgaSkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspXG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUodGhpcy5zaXplIC0gMSAtIGksIDgsIGdldEJpdChiaXRzLCBpKSk7XG4gICAgICBmb3IgKGxldCBpID0gODsgaSA8IDE1OyBpKyspXG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUoOCwgdGhpcy5zaXplIC0gMTUgKyBpLCBnZXRCaXQoYml0cywgaSkpO1xuICAgICAgdGhpcy5zZXRGdW5jdGlvbk1vZHVsZSg4LCB0aGlzLnNpemUgLSA4LCB0cnVlKTtcbiAgICB9XG4gICAgLy8gRHJhd3MgdHdvIGNvcGllcyBvZiB0aGUgdmVyc2lvbiBiaXRzICh3aXRoIGl0cyBvd24gZXJyb3IgY29ycmVjdGlvbiBjb2RlKSxcbiAgICAvLyBiYXNlZCBvbiB0aGlzIG9iamVjdCdzIHZlcnNpb24gZmllbGQsIGlmZiA3IDw9IHZlcnNpb24gPD0gNDAuXG4gICAgZHJhd1ZlcnNpb24oKSB7XG4gICAgICBpZiAodGhpcy52ZXJzaW9uIDwgNylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHJlbSA9IHRoaXMudmVyc2lvbjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IGkrKylcbiAgICAgICAgcmVtID0gcmVtIDw8IDEgXiAocmVtID4+PiAxMSkgKiA3OTczO1xuICAgICAgY29uc3QgYml0cyA9IHRoaXMudmVyc2lvbiA8PCAxMiB8IHJlbTtcbiAgICAgIGFzc2VydChiaXRzID4+PiAxOCA9PSAwKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2xvciA9IGdldEJpdChiaXRzLCBpKTtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuc2l6ZSAtIDExICsgaSAlIDM7XG4gICAgICAgIGNvbnN0IGIgPSBNYXRoLmZsb29yKGkgLyAzKTtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk1vZHVsZShhLCBiLCBjb2xvcik7XG4gICAgICAgIHRoaXMuc2V0RnVuY3Rpb25Nb2R1bGUoYiwgYSwgY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEcmF3cyBhIDkqOSBmaW5kZXIgcGF0dGVybiBpbmNsdWRpbmcgdGhlIGJvcmRlciBzZXBhcmF0b3IsXG4gICAgLy8gd2l0aCB0aGUgY2VudGVyIG1vZHVsZSBhdCAoeCwgeSkuIE1vZHVsZXMgY2FuIGJlIG91dCBvZiBib3VuZHMuXG4gICAgZHJhd0ZpbmRlclBhdHRlcm4oeCwgeSkge1xuICAgICAgZm9yIChsZXQgZHkgPSAtNDsgZHkgPD0gNDsgZHkrKykge1xuICAgICAgICBmb3IgKGxldCBkeCA9IC00OyBkeCA8PSA0OyBkeCsrKSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGgubWF4KE1hdGguYWJzKGR4KSwgTWF0aC5hYnMoZHkpKTtcbiAgICAgICAgICBjb25zdCB4eCA9IHggKyBkeDtcbiAgICAgICAgICBjb25zdCB5eSA9IHkgKyBkeTtcbiAgICAgICAgICBpZiAoMCA8PSB4eCAmJiB4eCA8IHRoaXMuc2l6ZSAmJiAwIDw9IHl5ICYmIHl5IDwgdGhpcy5zaXplKVxuICAgICAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk1vZHVsZSh4eCwgeXksIGRpc3QgIT0gMiAmJiBkaXN0ICE9IDQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIERyYXdzIGEgNSo1IGFsaWdubWVudCBwYXR0ZXJuLCB3aXRoIHRoZSBjZW50ZXIgbW9kdWxlXG4gICAgLy8gYXQgKHgsIHkpLiBBbGwgbW9kdWxlcyBtdXN0IGJlIGluIGJvdW5kcy5cbiAgICBkcmF3QWxpZ25tZW50UGF0dGVybih4LCB5KSB7XG4gICAgICBmb3IgKGxldCBkeSA9IC0yOyBkeSA8PSAyOyBkeSsrKSB7XG4gICAgICAgIGZvciAobGV0IGR4ID0gLTI7IGR4IDw9IDI7IGR4KyspXG4gICAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk1vZHVsZSh4ICsgZHgsIHkgKyBkeSwgTWF0aC5tYXgoTWF0aC5hYnMoZHgpLCBNYXRoLmFicyhkeSkpICE9IDEpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXRzIHRoZSBjb2xvciBvZiBhIG1vZHVsZSBhbmQgbWFya3MgaXQgYXMgYSBmdW5jdGlvbiBtb2R1bGUuXG4gICAgLy8gT25seSB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3Rvci4gQ29vcmRpbmF0ZXMgbXVzdCBiZSBpbiBib3VuZHMuXG4gICAgc2V0RnVuY3Rpb25Nb2R1bGUoeCwgeSwgaXNEYXJrKSB7XG4gICAgICB0aGlzLm1vZHVsZXNbeV1beF0gPSBpc0Rhcms7XG4gICAgICB0aGlzLmlzRnVuY3Rpb25beV1beF0gPSB0cnVlO1xuICAgIH1cbiAgICAvKi0tIFByaXZhdGUgaGVscGVyIG1ldGhvZHMgZm9yIGNvbnN0cnVjdG9yOiBDb2Rld29yZHMgYW5kIG1hc2tpbmcgLS0qL1xuICAgIC8vIFJldHVybnMgYSBuZXcgYnl0ZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBkYXRhIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvcnJlY3Rpb25cbiAgICAvLyBjb2Rld29yZHMgYXBwZW5kZWQgdG8gaXQsIGJhc2VkIG9uIHRoaXMgb2JqZWN0J3MgdmVyc2lvbiBhbmQgZXJyb3IgY29ycmVjdGlvbiBsZXZlbC5cbiAgICBhZGRFY2NBbmRJbnRlcmxlYXZlKGRhdGEpIHtcbiAgICAgIGNvbnN0IHZlciA9IHRoaXMudmVyc2lvbjtcbiAgICAgIGNvbnN0IGVjbCA9IHRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggIT0gX1FyQ29kZS5nZXROdW1EYXRhQ29kZXdvcmRzKHZlciwgZWNsKSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50XCIpO1xuICAgICAgY29uc3QgbnVtQmxvY2tzID0gX1FyQ29kZS5OVU1fRVJST1JfQ09SUkVDVElPTl9CTE9DS1NbZWNsLm9yZGluYWxdW3Zlcl07XG4gICAgICBjb25zdCBibG9ja0VjY0xlbiA9IF9RckNvZGUuRUNDX0NPREVXT1JEU19QRVJfQkxPQ0tbZWNsLm9yZGluYWxdW3Zlcl07XG4gICAgICBjb25zdCByYXdDb2Rld29yZHMgPSBNYXRoLmZsb29yKF9RckNvZGUuZ2V0TnVtUmF3RGF0YU1vZHVsZXModmVyKSAvIDgpO1xuICAgICAgY29uc3QgbnVtU2hvcnRCbG9ja3MgPSBudW1CbG9ja3MgLSByYXdDb2Rld29yZHMgJSBudW1CbG9ja3M7XG4gICAgICBjb25zdCBzaG9ydEJsb2NrTGVuID0gTWF0aC5mbG9vcihyYXdDb2Rld29yZHMgLyBudW1CbG9ja3MpO1xuICAgICAgbGV0IGJsb2NrcyA9IFtdO1xuICAgICAgY29uc3QgcnNEaXYgPSBfUXJDb2RlLnJlZWRTb2xvbW9uQ29tcHV0ZURpdmlzb3IoYmxvY2tFY2NMZW4pO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGsgPSAwOyBpIDwgbnVtQmxvY2tzOyBpKyspIHtcbiAgICAgICAgbGV0IGRhdCA9IGRhdGEuc2xpY2UoaywgayArIHNob3J0QmxvY2tMZW4gLSBibG9ja0VjY0xlbiArIChpIDwgbnVtU2hvcnRCbG9ja3MgPyAwIDogMSkpO1xuICAgICAgICBrICs9IGRhdC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVjYyA9IF9RckNvZGUucmVlZFNvbG9tb25Db21wdXRlUmVtYWluZGVyKGRhdCwgcnNEaXYpO1xuICAgICAgICBpZiAoaSA8IG51bVNob3J0QmxvY2tzKVxuICAgICAgICAgIGRhdC5wdXNoKDApO1xuICAgICAgICBibG9ja3MucHVzaChkYXQuY29uY2F0KGVjYykpO1xuICAgICAgfVxuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja3NbMF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmxvY2tzLmZvckVhY2goKGJsb2NrLCBqKSA9PiB7XG4gICAgICAgICAgaWYgKGkgIT0gc2hvcnRCbG9ja0xlbiAtIGJsb2NrRWNjTGVuIHx8IGogPj0gbnVtU2hvcnRCbG9ja3MpXG4gICAgICAgICAgICByZXN1bHQucHVzaChibG9ja1tpXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHJlc3VsdC5sZW5ndGggPT0gcmF3Q29kZXdvcmRzKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIERyYXdzIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiA4LWJpdCBjb2Rld29yZHMgKGRhdGEgYW5kIGVycm9yIGNvcnJlY3Rpb24pIG9udG8gdGhlIGVudGlyZVxuICAgIC8vIGRhdGEgYXJlYSBvZiB0aGlzIFFSIENvZGUuIEZ1bmN0aW9uIG1vZHVsZXMgbmVlZCB0byBiZSBtYXJrZWQgb2ZmIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC5cbiAgICBkcmF3Q29kZXdvcmRzKGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCAhPSBNYXRoLmZsb29yKF9RckNvZGUuZ2V0TnVtUmF3RGF0YU1vZHVsZXModGhpcy52ZXJzaW9uKSAvIDgpKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgYXJndW1lbnRcIik7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGxldCByaWdodCA9IHRoaXMuc2l6ZSAtIDE7IHJpZ2h0ID49IDE7IHJpZ2h0IC09IDIpIHtcbiAgICAgICAgaWYgKHJpZ2h0ID09IDYpXG4gICAgICAgICAgcmlnaHQgPSA1O1xuICAgICAgICBmb3IgKGxldCB2ZXJ0ID0gMDsgdmVydCA8IHRoaXMuc2l6ZTsgdmVydCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSByaWdodCAtIGo7XG4gICAgICAgICAgICBjb25zdCB1cHdhcmQgPSAocmlnaHQgKyAxICYgMikgPT0gMDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB1cHdhcmQgPyB0aGlzLnNpemUgLSAxIC0gdmVydCA6IHZlcnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNGdW5jdGlvblt5XVt4XSAmJiBpIDwgZGF0YS5sZW5ndGggKiA4KSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kdWxlc1t5XVt4XSA9IGdldEJpdChkYXRhW2kgPj4+IDNdLCA3IC0gKGkgJiA3KSk7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzc2VydChpID09IGRhdGEubGVuZ3RoICogOCk7XG4gICAgfVxuICAgIC8vIFhPUnMgdGhlIGNvZGV3b3JkIG1vZHVsZXMgaW4gdGhpcyBRUiBDb2RlIHdpdGggdGhlIGdpdmVuIG1hc2sgcGF0dGVybi5cbiAgICAvLyBUaGUgZnVuY3Rpb24gbW9kdWxlcyBtdXN0IGJlIG1hcmtlZCBhbmQgdGhlIGNvZGV3b3JkIGJpdHMgbXVzdCBiZSBkcmF3blxuICAgIC8vIGJlZm9yZSBtYXNraW5nLiBEdWUgdG8gdGhlIGFyaXRobWV0aWMgb2YgWE9SLCBjYWxsaW5nIGFwcGx5TWFzaygpIHdpdGhcbiAgICAvLyB0aGUgc2FtZSBtYXNrIHZhbHVlIGEgc2Vjb25kIHRpbWUgd2lsbCB1bmRvIHRoZSBtYXNrLiBBIGZpbmFsIHdlbGwtZm9ybWVkXG4gICAgLy8gUVIgQ29kZSBuZWVkcyBleGFjdGx5IG9uZSAobm90IHplcm8sIHR3bywgZXRjLikgbWFzayBhcHBsaWVkLlxuICAgIGFwcGx5TWFzayhtYXNrKSB7XG4gICAgICBpZiAobWFzayA8IDAgfHwgbWFzayA+IDcpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFzayB2YWx1ZSBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuc2l6ZTsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zaXplOyB4KyspIHtcbiAgICAgICAgICBsZXQgaW52ZXJ0O1xuICAgICAgICAgIHN3aXRjaCAobWFzaykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBpbnZlcnQgPSAoeCArIHkpICUgMiA9PSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgaW52ZXJ0ID0geSAlIDIgPT0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIGludmVydCA9IHggJSAzID09IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBpbnZlcnQgPSAoeCArIHkpICUgMyA9PSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgaW52ZXJ0ID0gKE1hdGguZmxvb3IoeCAvIDMpICsgTWF0aC5mbG9vcih5IC8gMikpICUgMiA9PSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgaW52ZXJ0ID0geCAqIHkgJSAyICsgeCAqIHkgJSAzID09IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICBpbnZlcnQgPSAoeCAqIHkgJSAyICsgeCAqIHkgJSAzKSAlIDIgPT0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIGludmVydCA9ICgoeCArIHkpICUgMiArIHggKiB5ICUgMykgJSAyID09IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWFjaGFibGVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uW3ldW3hdICYmIGludmVydClcbiAgICAgICAgICAgIHRoaXMubW9kdWxlc1t5XVt4XSA9ICF0aGlzLm1vZHVsZXNbeV1beF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcGVuYWx0eSBzY29yZSBiYXNlZCBvbiBzdGF0ZSBvZiB0aGlzIFFSIENvZGUncyBjdXJyZW50IG1vZHVsZXMuXG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdXRvbWF0aWMgbWFzayBjaG9pY2UgYWxnb3JpdGhtIHRvIGZpbmQgdGhlIG1hc2sgcGF0dGVybiB0aGF0IHlpZWxkcyB0aGUgbG93ZXN0IHNjb3JlLlxuICAgIGdldFBlbmFsdHlTY29yZSgpIHtcbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNpemU7IHkrKykge1xuICAgICAgICBsZXQgcnVuQ29sb3IgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJ1blggPSAwO1xuICAgICAgICBsZXQgcnVuSGlzdG9yeSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNpemU7IHgrKykge1xuICAgICAgICAgIGlmICh0aGlzLm1vZHVsZXNbeV1beF0gPT0gcnVuQ29sb3IpIHtcbiAgICAgICAgICAgIHJ1blgrKztcbiAgICAgICAgICAgIGlmIChydW5YID09IDUpXG4gICAgICAgICAgICAgIHJlc3VsdCArPSBfUXJDb2RlLlBFTkFMVFlfTjE7XG4gICAgICAgICAgICBlbHNlIGlmIChydW5YID4gNSlcbiAgICAgICAgICAgICAgcmVzdWx0Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmluZGVyUGVuYWx0eUFkZEhpc3RvcnkocnVuWCwgcnVuSGlzdG9yeSk7XG4gICAgICAgICAgICBpZiAoIXJ1bkNvbG9yKVxuICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5maW5kZXJQZW5hbHR5Q291bnRQYXR0ZXJucyhydW5IaXN0b3J5KSAqIF9RckNvZGUuUEVOQUxUWV9OMztcbiAgICAgICAgICAgIHJ1bkNvbG9yID0gdGhpcy5tb2R1bGVzW3ldW3hdO1xuICAgICAgICAgICAgcnVuWCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSB0aGlzLmZpbmRlclBlbmFsdHlUZXJtaW5hdGVBbmRDb3VudChydW5Db2xvciwgcnVuWCwgcnVuSGlzdG9yeSkgKiBfUXJDb2RlLlBFTkFMVFlfTjM7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuc2l6ZTsgeCsrKSB7XG4gICAgICAgIGxldCBydW5Db2xvciA9IGZhbHNlO1xuICAgICAgICBsZXQgcnVuWSA9IDA7XG4gICAgICAgIGxldCBydW5IaXN0b3J5ID0gWzAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuc2l6ZTsgeSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kdWxlc1t5XVt4XSA9PSBydW5Db2xvcikge1xuICAgICAgICAgICAgcnVuWSsrO1xuICAgICAgICAgICAgaWYgKHJ1blkgPT0gNSlcbiAgICAgICAgICAgICAgcmVzdWx0ICs9IF9RckNvZGUuUEVOQUxUWV9OMTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1blkgPiA1KVxuICAgICAgICAgICAgICByZXN1bHQrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maW5kZXJQZW5hbHR5QWRkSGlzdG9yeShydW5ZLCBydW5IaXN0b3J5KTtcbiAgICAgICAgICAgIGlmICghcnVuQ29sb3IpXG4gICAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmZpbmRlclBlbmFsdHlDb3VudFBhdHRlcm5zKHJ1bkhpc3RvcnkpICogX1FyQ29kZS5QRU5BTFRZX04zO1xuICAgICAgICAgICAgcnVuQ29sb3IgPSB0aGlzLm1vZHVsZXNbeV1beF07XG4gICAgICAgICAgICBydW5ZID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9IHRoaXMuZmluZGVyUGVuYWx0eVRlcm1pbmF0ZUFuZENvdW50KHJ1bkNvbG9yLCBydW5ZLCBydW5IaXN0b3J5KSAqIF9RckNvZGUuUEVOQUxUWV9OMztcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zaXplIC0gMTsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zaXplIC0gMTsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLm1vZHVsZXNbeV1beF07XG4gICAgICAgICAgaWYgKGNvbG9yID09IHRoaXMubW9kdWxlc1t5XVt4ICsgMV0gJiYgY29sb3IgPT0gdGhpcy5tb2R1bGVzW3kgKyAxXVt4XSAmJiBjb2xvciA9PSB0aGlzLm1vZHVsZXNbeSArIDFdW3ggKyAxXSlcbiAgICAgICAgICAgIHJlc3VsdCArPSBfUXJDb2RlLlBFTkFMVFlfTjI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBkYXJrID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMubW9kdWxlcylcbiAgICAgICAgZGFyayA9IHJvdy5yZWR1Y2UoKHN1bSwgY29sb3IpID0+IHN1bSArIChjb2xvciA/IDEgOiAwKSwgZGFyayk7XG4gICAgICBjb25zdCB0b3RhbCA9IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTtcbiAgICAgIGNvbnN0IGsgPSBNYXRoLmNlaWwoTWF0aC5hYnMoZGFyayAqIDIwIC0gdG90YWwgKiAxMCkgLyB0b3RhbCkgLSAxO1xuICAgICAgYXNzZXJ0KDAgPD0gayAmJiBrIDw9IDkpO1xuICAgICAgcmVzdWx0ICs9IGsgKiBfUXJDb2RlLlBFTkFMVFlfTjQ7XG4gICAgICBhc3NlcnQoMCA8PSByZXN1bHQgJiYgcmVzdWx0IDw9IDI1Njg4ODgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyotLSBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMgLS0qL1xuICAgIC8vIFJldHVybnMgYW4gYXNjZW5kaW5nIGxpc3Qgb2YgcG9zaXRpb25zIG9mIGFsaWdubWVudCBwYXR0ZXJucyBmb3IgdGhpcyB2ZXJzaW9uIG51bWJlci5cbiAgICAvLyBFYWNoIHBvc2l0aW9uIGlzIGluIHRoZSByYW5nZSBbMCwxNzcpLCBhbmQgYXJlIHVzZWQgb24gYm90aCB0aGUgeCBhbmQgeSBheGVzLlxuICAgIC8vIFRoaXMgY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgbG9va3VwIHRhYmxlIG9mIDQwIHZhcmlhYmxlLWxlbmd0aCBsaXN0cyBvZiBpbnRlZ2Vycy5cbiAgICBnZXRBbGlnbm1lbnRQYXR0ZXJuUG9zaXRpb25zKCkge1xuICAgICAgaWYgKHRoaXMudmVyc2lvbiA9PSAxKVxuICAgICAgICByZXR1cm4gW107XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbnVtQWxpZ24gPSBNYXRoLmZsb29yKHRoaXMudmVyc2lvbiAvIDcpICsgMjtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMudmVyc2lvbiA9PSAzMiA/IDI2IDogTWF0aC5jZWlsKCh0aGlzLnZlcnNpb24gKiA0ICsgNCkgLyAobnVtQWxpZ24gKiAyIC0gMikpICogMjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFs2XTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gdGhpcy5zaXplIC0gNzsgcmVzdWx0Lmxlbmd0aCA8IG51bUFsaWduOyBwb3MgLT0gc3RlcClcbiAgICAgICAgICByZXN1bHQuc3BsaWNlKDEsIDAsIHBvcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXRhIGJpdHMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGEgUVIgQ29kZSBvZiB0aGUgZ2l2ZW4gdmVyc2lvbiBudW1iZXIsIGFmdGVyXG4gICAgLy8gYWxsIGZ1bmN0aW9uIG1vZHVsZXMgYXJlIGV4Y2x1ZGVkLiBUaGlzIGluY2x1ZGVzIHJlbWFpbmRlciBiaXRzLCBzbyBpdCBtaWdodCBub3QgYmUgYSBtdWx0aXBsZSBvZiA4LlxuICAgIC8vIFRoZSByZXN1bHQgaXMgaW4gdGhlIHJhbmdlIFsyMDgsIDI5NjQ4XS4gVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIDQwLWVudHJ5IGxvb2t1cCB0YWJsZS5cbiAgICBzdGF0aWMgZ2V0TnVtUmF3RGF0YU1vZHVsZXModmVyKSB7XG4gICAgICBpZiAodmVyIDwgX1FyQ29kZS5NSU5fVkVSU0lPTiB8fCB2ZXIgPiBfUXJDb2RlLk1BWF9WRVJTSU9OKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZlcnNpb24gbnVtYmVyIG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGxldCByZXN1bHQgPSAoMTYgKiB2ZXIgKyAxMjgpICogdmVyICsgNjQ7XG4gICAgICBpZiAodmVyID49IDIpIHtcbiAgICAgICAgY29uc3QgbnVtQWxpZ24gPSBNYXRoLmZsb29yKHZlciAvIDcpICsgMjtcbiAgICAgICAgcmVzdWx0IC09ICgyNSAqIG51bUFsaWduIC0gMTApICogbnVtQWxpZ24gLSA1NTtcbiAgICAgICAgaWYgKHZlciA+PSA3KVxuICAgICAgICAgIHJlc3VsdCAtPSAzNjtcbiAgICAgIH1cbiAgICAgIGFzc2VydCgyMDggPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSAyOTY0OCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgOC1iaXQgZGF0YSAoaS5lLiBub3QgZXJyb3IgY29ycmVjdGlvbikgY29kZXdvcmRzIGNvbnRhaW5lZCBpbiBhbnlcbiAgICAvLyBRUiBDb2RlIG9mIHRoZSBnaXZlbiB2ZXJzaW9uIG51bWJlciBhbmQgZXJyb3IgY29ycmVjdGlvbiBsZXZlbCwgd2l0aCByZW1haW5kZXIgYml0cyBkaXNjYXJkZWQuXG4gICAgLy8gVGhpcyBzdGF0ZWxlc3MgcHVyZSBmdW5jdGlvbiBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhICg0MCo0KS1jZWxsIGxvb2t1cCB0YWJsZS5cbiAgICBzdGF0aWMgZ2V0TnVtRGF0YUNvZGV3b3Jkcyh2ZXIsIGVjbCkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoX1FyQ29kZS5nZXROdW1SYXdEYXRhTW9kdWxlcyh2ZXIpIC8gOCkgLSBfUXJDb2RlLkVDQ19DT0RFV09SRFNfUEVSX0JMT0NLW2VjbC5vcmRpbmFsXVt2ZXJdICogX1FyQ29kZS5OVU1fRVJST1JfQ09SUkVDVElPTl9CTE9DS1NbZWNsLm9yZGluYWxdW3Zlcl07XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBSZWVkLVNvbG9tb24gRUNDIGdlbmVyYXRvciBwb2x5bm9taWFsIGZvciB0aGUgZ2l2ZW4gZGVncmVlLiBUaGlzIGNvdWxkIGJlXG4gICAgLy8gaW1wbGVtZW50ZWQgYXMgYSBsb29rdXAgdGFibGUgb3ZlciBhbGwgcG9zc2libGUgcGFyYW1ldGVyIHZhbHVlcywgaW5zdGVhZCBvZiBhcyBhbiBhbGdvcml0aG0uXG4gICAgc3RhdGljIHJlZWRTb2xvbW9uQ29tcHV0ZURpdmlzb3IoZGVncmVlKSB7XG4gICAgICBpZiAoZGVncmVlIDwgMSB8fCBkZWdyZWUgPiAyNTUpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRGVncmVlIG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVncmVlIC0gMTsgaSsrKVxuICAgICAgICByZXN1bHQucHVzaCgwKTtcbiAgICAgIHJlc3VsdC5wdXNoKDEpO1xuICAgICAgbGV0IHJvb3QgPSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWdyZWU7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJlc3VsdFtqXSA9IF9RckNvZGUucmVlZFNvbG9tb25NdWx0aXBseShyZXN1bHRbal0sIHJvb3QpO1xuICAgICAgICAgIGlmIChqICsgMSA8IHJlc3VsdC5sZW5ndGgpXG4gICAgICAgICAgICByZXN1bHRbal0gXj0gcmVzdWx0W2ogKyAxXTtcbiAgICAgICAgfVxuICAgICAgICByb290ID0gX1FyQ29kZS5yZWVkU29sb21vbk11bHRpcGx5KHJvb3QsIDIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgUmVlZC1Tb2xvbW9uIGVycm9yIGNvcnJlY3Rpb24gY29kZXdvcmQgZm9yIHRoZSBnaXZlbiBkYXRhIGFuZCBkaXZpc29yIHBvbHlub21pYWxzLlxuICAgIHN0YXRpYyByZWVkU29sb21vbkNvbXB1dGVSZW1haW5kZXIoZGF0YSwgZGl2aXNvcikge1xuICAgICAgbGV0IHJlc3VsdCA9IGRpdmlzb3IubWFwKChfKSA9PiAwKTtcbiAgICAgIGZvciAoY29uc3QgYiBvZiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGZhY3RvciA9IGIgXiByZXN1bHQuc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0LnB1c2goMCk7XG4gICAgICAgIGRpdmlzb3IuZm9yRWFjaCgoY29lZiwgaSkgPT4gcmVzdWx0W2ldIF49IF9RckNvZGUucmVlZFNvbG9tb25NdWx0aXBseShjb2VmLCBmYWN0b3IpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhlIHR3byBnaXZlbiBmaWVsZCBlbGVtZW50cyBtb2R1bG8gR0YoMl44LzB4MTFEKS4gVGhlIGFyZ3VtZW50cyBhbmQgcmVzdWx0XG4gICAgLy8gYXJlIHVuc2lnbmVkIDgtYml0IGludGVnZXJzLiBUaGlzIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgbG9va3VwIHRhYmxlIG9mIDI1NioyNTYgZW50cmllcyBvZiB1aW50OC5cbiAgICBzdGF0aWMgcmVlZFNvbG9tb25NdWx0aXBseSh4LCB5KSB7XG4gICAgICBpZiAoeCA+Pj4gOCAhPSAwIHx8IHkgPj4+IDggIT0gMClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCeXRlIG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGxldCB6ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSA3OyBpID49IDA7IGktLSkge1xuICAgICAgICB6ID0geiA8PCAxIF4gKHogPj4+IDcpICogMjg1O1xuICAgICAgICB6IF49ICh5ID4+PiBpICYgMSkgKiB4O1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHogPj4+IDggPT0gMCk7XG4gICAgICByZXR1cm4gejtcbiAgICB9XG4gICAgLy8gQ2FuIG9ubHkgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgbGlnaHQgcnVuIGlzIGFkZGVkLCBhbmRcbiAgICAvLyByZXR1cm5zIGVpdGhlciAwLCAxLCBvciAyLiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0UGVuYWx0eVNjb3JlKCkuXG4gICAgZmluZGVyUGVuYWx0eUNvdW50UGF0dGVybnMocnVuSGlzdG9yeSkge1xuICAgICAgY29uc3QgbiA9IHJ1bkhpc3RvcnlbMV07XG4gICAgICBhc3NlcnQobiA8PSB0aGlzLnNpemUgKiAzKTtcbiAgICAgIGNvbnN0IGNvcmUgPSBuID4gMCAmJiBydW5IaXN0b3J5WzJdID09IG4gJiYgcnVuSGlzdG9yeVszXSA9PSBuICogMyAmJiBydW5IaXN0b3J5WzRdID09IG4gJiYgcnVuSGlzdG9yeVs1XSA9PSBuO1xuICAgICAgcmV0dXJuIChjb3JlICYmIHJ1bkhpc3RvcnlbMF0gPj0gbiAqIDQgJiYgcnVuSGlzdG9yeVs2XSA+PSBuID8gMSA6IDApICsgKGNvcmUgJiYgcnVuSGlzdG9yeVs2XSA+PSBuICogNCAmJiBydW5IaXN0b3J5WzBdID49IG4gPyAxIDogMCk7XG4gICAgfVxuICAgIC8vIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBsaW5lIChyb3cgb3IgY29sdW1uKSBvZiBtb2R1bGVzLiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0UGVuYWx0eVNjb3JlKCkuXG4gICAgZmluZGVyUGVuYWx0eVRlcm1pbmF0ZUFuZENvdW50KGN1cnJlbnRSdW5Db2xvciwgY3VycmVudFJ1bkxlbmd0aCwgcnVuSGlzdG9yeSkge1xuICAgICAgaWYgKGN1cnJlbnRSdW5Db2xvcikge1xuICAgICAgICB0aGlzLmZpbmRlclBlbmFsdHlBZGRIaXN0b3J5KGN1cnJlbnRSdW5MZW5ndGgsIHJ1bkhpc3RvcnkpO1xuICAgICAgICBjdXJyZW50UnVuTGVuZ3RoID0gMDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSdW5MZW5ndGggKz0gdGhpcy5zaXplO1xuICAgICAgdGhpcy5maW5kZXJQZW5hbHR5QWRkSGlzdG9yeShjdXJyZW50UnVuTGVuZ3RoLCBydW5IaXN0b3J5KTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRlclBlbmFsdHlDb3VudFBhdHRlcm5zKHJ1bkhpc3RvcnkpO1xuICAgIH1cbiAgICAvLyBQdXNoZXMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBmcm9udCBhbmQgZHJvcHMgdGhlIGxhc3QgdmFsdWUuIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXRQZW5hbHR5U2NvcmUoKS5cbiAgICBmaW5kZXJQZW5hbHR5QWRkSGlzdG9yeShjdXJyZW50UnVuTGVuZ3RoLCBydW5IaXN0b3J5KSB7XG4gICAgICBpZiAocnVuSGlzdG9yeVswXSA9PSAwKVxuICAgICAgICBjdXJyZW50UnVuTGVuZ3RoICs9IHRoaXMuc2l6ZTtcbiAgICAgIHJ1bkhpc3RvcnkucG9wKCk7XG4gICAgICBydW5IaXN0b3J5LnVuc2hpZnQoY3VycmVudFJ1bkxlbmd0aCk7XG4gICAgfVxuICB9O1xuICAvKi0tIENvbnN0YW50cyBhbmQgdGFibGVzIC0tKi9cbiAgLy8gVGhlIG1pbmltdW0gdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGluIHRoZSBRUiBDb2RlIE1vZGVsIDIgc3RhbmRhcmQuXG4gIF9RckNvZGUuTUlOX1ZFUlNJT04gPSAxO1xuICAvLyBUaGUgbWF4aW11bSB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgaW4gdGhlIFFSIENvZGUgTW9kZWwgMiBzdGFuZGFyZC5cbiAgX1FyQ29kZS5NQVhfVkVSU0lPTiA9IDQwO1xuICAvLyBGb3IgdXNlIGluIGdldFBlbmFsdHlTY29yZSgpLCB3aGVuIGV2YWx1YXRpbmcgd2hpY2ggbWFzayBpcyBiZXN0LlxuICBfUXJDb2RlLlBFTkFMVFlfTjEgPSAzO1xuICBfUXJDb2RlLlBFTkFMVFlfTjIgPSAzO1xuICBfUXJDb2RlLlBFTkFMVFlfTjMgPSA0MDtcbiAgX1FyQ29kZS5QRU5BTFRZX040ID0gMTA7XG4gIF9RckNvZGUuRUNDX0NPREVXT1JEU19QRVJfQkxPQ0sgPSBbXG4gICAgLy8gVmVyc2lvbjogKG5vdGUgdGhhdCBpbmRleCAwIGlzIGZvciBwYWRkaW5nLCBhbmQgaXMgc2V0IHRvIGFuIGlsbGVnYWwgdmFsdWUpXG4gICAgLy8wLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCAgICBFcnJvciBjb3JyZWN0aW9uIGxldmVsXG4gICAgWy0xLCA3LCAxMCwgMTUsIDIwLCAyNiwgMTgsIDIwLCAyNCwgMzAsIDE4LCAyMCwgMjQsIDI2LCAzMCwgMjIsIDI0LCAyOCwgMzAsIDI4LCAyOCwgMjgsIDI4LCAzMCwgMzAsIDI2LCAyOCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwXSxcbiAgICAvLyBMb3dcbiAgICBbLTEsIDEwLCAxNiwgMjYsIDE4LCAyNCwgMTYsIDE4LCAyMiwgMjIsIDI2LCAzMCwgMjIsIDIyLCAyNCwgMjQsIDI4LCAyOCwgMjYsIDI2LCAyNiwgMjYsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4XSxcbiAgICAvLyBNZWRpdW1cbiAgICBbLTEsIDEzLCAyMiwgMTgsIDI2LCAxOCwgMjQsIDE4LCAyMiwgMjAsIDI0LCAyOCwgMjYsIDI0LCAyMCwgMzAsIDI0LCAyOCwgMjgsIDI2LCAzMCwgMjgsIDMwLCAzMCwgMzAsIDMwLCAyOCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwXSxcbiAgICAvLyBRdWFydGlsZVxuICAgIFstMSwgMTcsIDI4LCAyMiwgMTYsIDIyLCAyOCwgMjYsIDI2LCAyNCwgMjgsIDI0LCAyOCwgMjIsIDI0LCAyNCwgMzAsIDI4LCAyOCwgMjYsIDI4LCAzMCwgMjQsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzBdXG4gICAgLy8gSGlnaFxuICBdO1xuICBfUXJDb2RlLk5VTV9FUlJPUl9DT1JSRUNUSU9OX0JMT0NLUyA9IFtcbiAgICAvLyBWZXJzaW9uOiAobm90ZSB0aGF0IGluZGV4IDAgaXMgZm9yIHBhZGRpbmcsIGFuZCBpcyBzZXQgdG8gYW4gaWxsZWdhbCB2YWx1ZSlcbiAgICAvLzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAgICAgRXJyb3IgY29ycmVjdGlvbiBsZXZlbFxuICAgIFstMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgNCwgNCwgNCwgNCwgNCwgNiwgNiwgNiwgNiwgNywgOCwgOCwgOSwgOSwgMTAsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAxOSwgMjAsIDIxLCAyMiwgMjQsIDI1XSxcbiAgICAvLyBMb3dcbiAgICBbLTEsIDEsIDEsIDEsIDIsIDIsIDQsIDQsIDQsIDUsIDUsIDUsIDgsIDksIDksIDEwLCAxMCwgMTEsIDEzLCAxNCwgMTYsIDE3LCAxNywgMTgsIDIwLCAyMSwgMjMsIDI1LCAyNiwgMjgsIDI5LCAzMSwgMzMsIDM1LCAzNywgMzgsIDQwLCA0MywgNDUsIDQ3LCA0OV0sXG4gICAgLy8gTWVkaXVtXG4gICAgWy0xLCAxLCAxLCAyLCAyLCA0LCA0LCA2LCA2LCA4LCA4LCA4LCAxMCwgMTIsIDE2LCAxMiwgMTcsIDE2LCAxOCwgMjEsIDIwLCAyMywgMjMsIDI1LCAyNywgMjksIDM0LCAzNCwgMzUsIDM4LCA0MCwgNDMsIDQ1LCA0OCwgNTEsIDUzLCA1NiwgNTksIDYyLCA2NSwgNjhdLFxuICAgIC8vIFF1YXJ0aWxlXG4gICAgWy0xLCAxLCAxLCAyLCA0LCA0LCA0LCA1LCA2LCA4LCA4LCAxMSwgMTEsIDE2LCAxNiwgMTgsIDE2LCAxOSwgMjEsIDI1LCAyNSwgMjUsIDM0LCAzMCwgMzIsIDM1LCAzNywgNDAsIDQyLCA0NSwgNDgsIDUxLCA1NCwgNTcsIDYwLCA2MywgNjYsIDcwLCA3NCwgNzcsIDgxXVxuICAgIC8vIEhpZ2hcbiAgXTtcbiAgbGV0IFFyQ29kZSA9IF9RckNvZGU7XG4gIHFyY29kZWdlbjIuUXJDb2RlID0gX1FyQ29kZTtcbiAgZnVuY3Rpb24gYXBwZW5kQml0cyh2YWwsIGxlbiwgYmIpIHtcbiAgICBpZiAobGVuIDwgMCB8fCBsZW4gPiAzMSB8fCB2YWwgPj4+IGxlbiAhPSAwKVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJWYWx1ZSBvdXQgb2YgcmFuZ2VcIik7XG4gICAgZm9yIChsZXQgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgYmIucHVzaCh2YWwgPj4+IGkgJiAxKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRCaXQoeCwgaSkge1xuICAgIHJldHVybiAoeCA+Pj4gaSAmIDEpICE9IDA7XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0KGNvbmQpIHtcbiAgICBpZiAoIWNvbmQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3NlcnRpb24gZXJyb3JcIik7XG4gIH1cbiAgY29uc3QgX1FyU2VnbWVudCA9IGNsYXNzIF9RclNlZ21lbnQge1xuICAgIC8qLS0gQ29uc3RydWN0b3IgKGxvdyBsZXZlbCkgYW5kIGZpZWxkcyAtLSovXG4gICAgLy8gQ3JlYXRlcyBhIG5ldyBRUiBDb2RlIHNlZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhbmQgZGF0YS5cbiAgICAvLyBUaGUgY2hhcmFjdGVyIGNvdW50IChudW1DaGFycykgbXVzdCBhZ3JlZSB3aXRoIHRoZSBtb2RlIGFuZCB0aGUgYml0IGJ1ZmZlciBsZW5ndGgsXG4gICAgLy8gYnV0IHRoZSBjb25zdHJhaW50IGlzbid0IGNoZWNrZWQuIFRoZSBnaXZlbiBiaXQgYnVmZmVyIGlzIGNsb25lZCBhbmQgc3RvcmVkLlxuICAgIGNvbnN0cnVjdG9yKG1vZGUsIG51bUNoYXJzLCBiaXREYXRhKSB7XG4gICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5udW1DaGFycyA9IG51bUNoYXJzO1xuICAgICAgdGhpcy5iaXREYXRhID0gYml0RGF0YTtcbiAgICAgIGlmIChudW1DaGFycyA8IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudFwiKTtcbiAgICAgIHRoaXMuYml0RGF0YSA9IGJpdERhdGEuc2xpY2UoKTtcbiAgICB9XG4gICAgLyotLSBTdGF0aWMgZmFjdG9yeSBmdW5jdGlvbnMgKG1pZCBsZXZlbCkgLS0qL1xuICAgIC8vIFJldHVybnMgYSBzZWdtZW50IHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYmluYXJ5IGRhdGEgZW5jb2RlZCBpblxuICAgIC8vIGJ5dGUgbW9kZS4gQWxsIGlucHV0IGJ5dGUgYXJyYXlzIGFyZSBhY2NlcHRhYmxlLiBBbnkgdGV4dCBzdHJpbmdcbiAgICAvLyBjYW4gYmUgY29udmVydGVkIHRvIFVURi04IGJ5dGVzIGFuZCBlbmNvZGVkIGFzIGEgYnl0ZSBtb2RlIHNlZ21lbnQuXG4gICAgc3RhdGljIG1ha2VCeXRlcyhkYXRhKSB7XG4gICAgICBsZXQgYmIgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYiBvZiBkYXRhKVxuICAgICAgICBhcHBlbmRCaXRzKGIsIDgsIGJiKTtcbiAgICAgIHJldHVybiBuZXcgX1FyU2VnbWVudChfUXJTZWdtZW50Lk1vZGUuQllURSwgZGF0YS5sZW5ndGgsIGJiKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIHNlZ21lbnQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdHJpbmcgb2YgZGVjaW1hbCBkaWdpdHMgZW5jb2RlZCBpbiBudW1lcmljIG1vZGUuXG4gICAgc3RhdGljIG1ha2VOdW1lcmljKGRpZ2l0cykge1xuICAgICAgaWYgKCFfUXJTZWdtZW50LmlzTnVtZXJpYyhkaWdpdHMpKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlN0cmluZyBjb250YWlucyBub24tbnVtZXJpYyBjaGFyYWN0ZXJzXCIpO1xuICAgICAgbGV0IGJiID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0cy5sZW5ndGg7ICkge1xuICAgICAgICBjb25zdCBuID0gTWF0aC5taW4oZGlnaXRzLmxlbmd0aCAtIGksIDMpO1xuICAgICAgICBhcHBlbmRCaXRzKHBhcnNlSW50KGRpZ2l0cy5zdWJzdHJpbmcoaSwgaSArIG4pLCAxMCksIG4gKiAzICsgMSwgYmIpO1xuICAgICAgICBpICs9IG47XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IF9RclNlZ21lbnQoX1FyU2VnbWVudC5Nb2RlLk5VTUVSSUMsIGRpZ2l0cy5sZW5ndGgsIGJiKTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIHNlZ21lbnQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB0ZXh0IHN0cmluZyBlbmNvZGVkIGluIGFscGhhbnVtZXJpYyBtb2RlLlxuICAgIC8vIFRoZSBjaGFyYWN0ZXJzIGFsbG93ZWQgYXJlOiAwIHRvIDksIEEgdG8gWiAodXBwZXJjYXNlIG9ubHkpLCBzcGFjZSxcbiAgICAvLyBkb2xsYXIsIHBlcmNlbnQsIGFzdGVyaXNrLCBwbHVzLCBoeXBoZW4sIHBlcmlvZCwgc2xhc2gsIGNvbG9uLlxuICAgIHN0YXRpYyBtYWtlQWxwaGFudW1lcmljKHRleHQpIHtcbiAgICAgIGlmICghX1FyU2VnbWVudC5pc0FscGhhbnVtZXJpYyh0ZXh0KSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTdHJpbmcgY29udGFpbnMgdW5lbmNvZGFibGUgY2hhcmFjdGVycyBpbiBhbHBoYW51bWVyaWMgbW9kZVwiKTtcbiAgICAgIGxldCBiYiA9IFtdO1xuICAgICAgbGV0IGk7XG4gICAgICBmb3IgKGkgPSAwOyBpICsgMiA8PSB0ZXh0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGxldCB0ZW1wID0gX1FyU2VnbWVudC5BTFBIQU5VTUVSSUNfQ0hBUlNFVC5pbmRleE9mKHRleHQuY2hhckF0KGkpKSAqIDQ1O1xuICAgICAgICB0ZW1wICs9IF9RclNlZ21lbnQuQUxQSEFOVU1FUklDX0NIQVJTRVQuaW5kZXhPZih0ZXh0LmNoYXJBdChpICsgMSkpO1xuICAgICAgICBhcHBlbmRCaXRzKHRlbXAsIDExLCBiYik7XG4gICAgICB9XG4gICAgICBpZiAoaSA8IHRleHQubGVuZ3RoKVxuICAgICAgICBhcHBlbmRCaXRzKF9RclNlZ21lbnQuQUxQSEFOVU1FUklDX0NIQVJTRVQuaW5kZXhPZih0ZXh0LmNoYXJBdChpKSksIDYsIGJiKTtcbiAgICAgIHJldHVybiBuZXcgX1FyU2VnbWVudChfUXJTZWdtZW50Lk1vZGUuQUxQSEFOVU1FUklDLCB0ZXh0Lmxlbmd0aCwgYmIpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgbmV3IG11dGFibGUgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBVbmljb2RlIHRleHQgc3RyaW5nLlxuICAgIC8vIFRoZSByZXN1bHQgbWF5IHVzZSB2YXJpb3VzIHNlZ21lbnQgbW9kZXMgYW5kIHN3aXRjaCBtb2RlcyB0byBvcHRpbWl6ZSB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgc3RyZWFtLlxuICAgIHN0YXRpYyBtYWtlU2VnbWVudHModGV4dCkge1xuICAgICAgaWYgKHRleHQgPT0gXCJcIilcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgZWxzZSBpZiAoX1FyU2VnbWVudC5pc051bWVyaWModGV4dCkpXG4gICAgICAgIHJldHVybiBbX1FyU2VnbWVudC5tYWtlTnVtZXJpYyh0ZXh0KV07XG4gICAgICBlbHNlIGlmIChfUXJTZWdtZW50LmlzQWxwaGFudW1lcmljKHRleHQpKVxuICAgICAgICByZXR1cm4gW19RclNlZ21lbnQubWFrZUFscGhhbnVtZXJpYyh0ZXh0KV07XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBbX1FyU2VnbWVudC5tYWtlQnl0ZXMoX1FyU2VnbWVudC50b1V0ZjhCeXRlQXJyYXkodGV4dCkpXTtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIHNlZ21lbnQgcmVwcmVzZW50aW5nIGFuIEV4dGVuZGVkIENoYW5uZWwgSW50ZXJwcmV0YXRpb25cbiAgICAvLyAoRUNJKSBkZXNpZ25hdG9yIHdpdGggdGhlIGdpdmVuIGFzc2lnbm1lbnQgdmFsdWUuXG4gICAgc3RhdGljIG1ha2VFY2koYXNzaWduVmFsKSB7XG4gICAgICBsZXQgYmIgPSBbXTtcbiAgICAgIGlmIChhc3NpZ25WYWwgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVDSSBhc3NpZ25tZW50IHZhbHVlIG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGVsc2UgaWYgKGFzc2lnblZhbCA8IDEgPDwgNylcbiAgICAgICAgYXBwZW5kQml0cyhhc3NpZ25WYWwsIDgsIGJiKTtcbiAgICAgIGVsc2UgaWYgKGFzc2lnblZhbCA8IDEgPDwgMTQpIHtcbiAgICAgICAgYXBwZW5kQml0cygyLCAyLCBiYik7XG4gICAgICAgIGFwcGVuZEJpdHMoYXNzaWduVmFsLCAxNCwgYmIpO1xuICAgICAgfSBlbHNlIGlmIChhc3NpZ25WYWwgPCAxZTYpIHtcbiAgICAgICAgYXBwZW5kQml0cyg2LCAzLCBiYik7XG4gICAgICAgIGFwcGVuZEJpdHMoYXNzaWduVmFsLCAyMSwgYmIpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRUNJIGFzc2lnbm1lbnQgdmFsdWUgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgcmV0dXJuIG5ldyBfUXJTZWdtZW50KF9RclNlZ21lbnQuTW9kZS5FQ0ksIDAsIGJiKTtcbiAgICB9XG4gICAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIGNhbiBiZSBlbmNvZGVkIGFzIGEgc2VnbWVudCBpbiBudW1lcmljIG1vZGUuXG4gICAgLy8gQSBzdHJpbmcgaXMgZW5jb2RhYmxlIGlmZiBlYWNoIGNoYXJhY3RlciBpcyBpbiB0aGUgcmFuZ2UgMCB0byA5LlxuICAgIHN0YXRpYyBpc051bWVyaWModGV4dCkge1xuICAgICAgcmV0dXJuIF9RclNlZ21lbnQuTlVNRVJJQ19SRUdFWC50ZXN0KHRleHQpO1xuICAgIH1cbiAgICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgY2FuIGJlIGVuY29kZWQgYXMgYSBzZWdtZW50IGluIGFscGhhbnVtZXJpYyBtb2RlLlxuICAgIC8vIEEgc3RyaW5nIGlzIGVuY29kYWJsZSBpZmYgZWFjaCBjaGFyYWN0ZXIgaXMgaW4gdGhlIGZvbGxvd2luZyBzZXQ6IDAgdG8gOSwgQSB0byBaXG4gICAgLy8gKHVwcGVyY2FzZSBvbmx5KSwgc3BhY2UsIGRvbGxhciwgcGVyY2VudCwgYXN0ZXJpc2ssIHBsdXMsIGh5cGhlbiwgcGVyaW9kLCBzbGFzaCwgY29sb24uXG4gICAgc3RhdGljIGlzQWxwaGFudW1lcmljKHRleHQpIHtcbiAgICAgIHJldHVybiBfUXJTZWdtZW50LkFMUEhBTlVNRVJJQ19SRUdFWC50ZXN0KHRleHQpO1xuICAgIH1cbiAgICAvKi0tIE1ldGhvZHMgLS0qL1xuICAgIC8vIFJldHVybnMgYSBuZXcgY29weSBvZiB0aGUgZGF0YSBiaXRzIG9mIHRoaXMgc2VnbWVudC5cbiAgICBnZXREYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYml0RGF0YS5zbGljZSgpO1xuICAgIH1cbiAgICAvLyAoUGFja2FnZS1wcml2YXRlKSBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiBzZWdtZW50cyBhdFxuICAgIC8vIHRoZSBnaXZlbiB2ZXJzaW9uLiBUaGUgcmVzdWx0IGlzIGluZmluaXR5IGlmIGEgc2VnbWVudCBoYXMgdG9vIG1hbnkgY2hhcmFjdGVycyB0byBmaXQgaXRzIGxlbmd0aCBmaWVsZC5cbiAgICBzdGF0aWMgZ2V0VG90YWxCaXRzKHNlZ3MsIHZlcnNpb24pIHtcbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgICAgICBjb25zdCBjY2JpdHMgPSBzZWcubW9kZS5udW1DaGFyQ291bnRCaXRzKHZlcnNpb24pO1xuICAgICAgICBpZiAoc2VnLm51bUNoYXJzID49IDEgPDwgY2NiaXRzKVxuICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgcmVzdWx0ICs9IDQgKyBjY2JpdHMgKyBzZWcuYml0RGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gc3RyaW5nIGVuY29kZWQgaW4gVVRGLTguXG4gICAgc3RhdGljIHRvVXRmOEJ5dGVBcnJheShzdHIpIHtcbiAgICAgIHN0ciA9IGVuY29kZVVSSShzdHIpO1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoaSkgIT0gXCIlXCIpXG4gICAgICAgICAgcmVzdWx0LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChzdHIuc3Vic3RyaW5nKGkgKyAxLCBpICsgMyksIDE2KSk7XG4gICAgICAgICAgaSArPSAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfTtcbiAgLyotLSBDb25zdGFudHMgLS0qL1xuICAvLyBEZXNjcmliZXMgcHJlY2lzZWx5IGFsbCBzdHJpbmdzIHRoYXQgYXJlIGVuY29kYWJsZSBpbiBudW1lcmljIG1vZGUuXG4gIF9RclNlZ21lbnQuTlVNRVJJQ19SRUdFWCA9IC9eWzAtOV0qJC87XG4gIC8vIERlc2NyaWJlcyBwcmVjaXNlbHkgYWxsIHN0cmluZ3MgdGhhdCBhcmUgZW5jb2RhYmxlIGluIGFscGhhbnVtZXJpYyBtb2RlLlxuICBfUXJTZWdtZW50LkFMUEhBTlVNRVJJQ19SRUdFWCA9IC9eW0EtWjAtOSAkJSorLlxcLzotXSokLztcbiAgLy8gVGhlIHNldCBvZiBhbGwgbGVnYWwgY2hhcmFjdGVycyBpbiBhbHBoYW51bWVyaWMgbW9kZSxcbiAgLy8gd2hlcmUgZWFjaCBjaGFyYWN0ZXIgdmFsdWUgbWFwcyB0byB0aGUgaW5kZXggaW4gdGhlIHN0cmluZy5cbiAgX1FyU2VnbWVudC5BTFBIQU5VTUVSSUNfQ0hBUlNFVCA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaICQlKistLi86XCI7XG4gIGxldCBRclNlZ21lbnQgPSBfUXJTZWdtZW50O1xuICBxcmNvZGVnZW4yLlFyU2VnbWVudCA9IF9RclNlZ21lbnQ7XG59KShxcmNvZGVnZW4gfHwgKHFyY29kZWdlbiA9IHt9KSk7XG4oKHFyY29kZWdlbjIpID0+IHtcbiAgbGV0IFFyQ29kZTtcbiAgKChRckNvZGUyKSA9PiB7XG4gICAgY29uc3QgX0VjYyA9IGNsYXNzIF9FY2Mge1xuICAgICAgLy8gVGhlIFFSIENvZGUgY2FuIHRvbGVyYXRlIGFib3V0IDMwJSBlcnJvbmVvdXMgY29kZXdvcmRzXG4gICAgICAvKi0tIENvbnN0cnVjdG9yIGFuZCBmaWVsZHMgLS0qL1xuICAgICAgY29uc3RydWN0b3Iob3JkaW5hbCwgZm9ybWF0Qml0cykge1xuICAgICAgICB0aGlzLm9yZGluYWwgPSBvcmRpbmFsO1xuICAgICAgICB0aGlzLmZvcm1hdEJpdHMgPSBmb3JtYXRCaXRzO1xuICAgICAgfVxuICAgIH07XG4gICAgLyotLSBDb25zdGFudHMgLS0qL1xuICAgIF9FY2MuTE9XID0gbmV3IF9FY2MoMCwgMSk7XG4gICAgLy8gVGhlIFFSIENvZGUgY2FuIHRvbGVyYXRlIGFib3V0ICA3JSBlcnJvbmVvdXMgY29kZXdvcmRzXG4gICAgX0VjYy5NRURJVU0gPSBuZXcgX0VjYygxLCAwKTtcbiAgICAvLyBUaGUgUVIgQ29kZSBjYW4gdG9sZXJhdGUgYWJvdXQgMTUlIGVycm9uZW91cyBjb2Rld29yZHNcbiAgICBfRWNjLlFVQVJUSUxFID0gbmV3IF9FY2MoMiwgMyk7XG4gICAgLy8gVGhlIFFSIENvZGUgY2FuIHRvbGVyYXRlIGFib3V0IDI1JSBlcnJvbmVvdXMgY29kZXdvcmRzXG4gICAgX0VjYy5ISUdIID0gbmV3IF9FY2MoMywgMik7XG4gICAgbGV0IEVjYyA9IF9FY2M7XG4gICAgUXJDb2RlMi5FY2MgPSBfRWNjO1xuICB9KShRckNvZGUgPSBxcmNvZGVnZW4yLlFyQ29kZSB8fCAocXJjb2RlZ2VuMi5RckNvZGUgPSB7fSkpO1xufSkocXJjb2RlZ2VuIHx8IChxcmNvZGVnZW4gPSB7fSkpO1xuKChxcmNvZGVnZW4yKSA9PiB7XG4gIGxldCBRclNlZ21lbnQ7XG4gICgoUXJTZWdtZW50MikgPT4ge1xuICAgIGNvbnN0IF9Nb2RlID0gY2xhc3MgX01vZGUge1xuICAgICAgLyotLSBDb25zdHJ1Y3RvciBhbmQgZmllbGRzIC0tKi9cbiAgICAgIGNvbnN0cnVjdG9yKG1vZGVCaXRzLCBudW1CaXRzQ2hhckNvdW50KSB7XG4gICAgICAgIHRoaXMubW9kZUJpdHMgPSBtb2RlQml0cztcbiAgICAgICAgdGhpcy5udW1CaXRzQ2hhckNvdW50ID0gbnVtQml0c0NoYXJDb3VudDtcbiAgICAgIH1cbiAgICAgIC8qLS0gTWV0aG9kIC0tKi9cbiAgICAgIC8vIChQYWNrYWdlLXByaXZhdGUpIFJldHVybnMgdGhlIGJpdCB3aWR0aCBvZiB0aGUgY2hhcmFjdGVyIGNvdW50IGZpZWxkIGZvciBhIHNlZ21lbnQgaW5cbiAgICAgIC8vIHRoaXMgbW9kZSBpbiBhIFFSIENvZGUgYXQgdGhlIGdpdmVuIHZlcnNpb24gbnVtYmVyLiBUaGUgcmVzdWx0IGlzIGluIHRoZSByYW5nZSBbMCwgMTZdLlxuICAgICAgbnVtQ2hhckNvdW50Qml0cyh2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtQml0c0NoYXJDb3VudFtNYXRoLmZsb29yKCh2ZXIgKyA3KSAvIDE3KV07XG4gICAgICB9XG4gICAgfTtcbiAgICAvKi0tIENvbnN0YW50cyAtLSovXG4gICAgX01vZGUuTlVNRVJJQyA9IG5ldyBfTW9kZSgxLCBbMTAsIDEyLCAxNF0pO1xuICAgIF9Nb2RlLkFMUEhBTlVNRVJJQyA9IG5ldyBfTW9kZSgyLCBbOSwgMTEsIDEzXSk7XG4gICAgX01vZGUuQllURSA9IG5ldyBfTW9kZSg0LCBbOCwgMTYsIDE2XSk7XG4gICAgX01vZGUuS0FOSkkgPSBuZXcgX01vZGUoOCwgWzgsIDEwLCAxMl0pO1xuICAgIF9Nb2RlLkVDSSA9IG5ldyBfTW9kZSg3LCBbMCwgMCwgMF0pO1xuICAgIGxldCBNb2RlID0gX01vZGU7XG4gICAgUXJTZWdtZW50Mi5Nb2RlID0gX01vZGU7XG4gIH0pKFFyU2VnbWVudCA9IHFyY29kZWdlbjIuUXJTZWdtZW50IHx8IChxcmNvZGVnZW4yLlFyU2VnbWVudCA9IHt9KSk7XG59KShxcmNvZGVnZW4gfHwgKHFyY29kZWdlbiA9IHt9KSk7XG52YXIgcXJjb2RlZ2VuX2RlZmF1bHQgPSBxcmNvZGVnZW47XG5cbi8vIHNyYy9pbmRleC50c3hcbi8qKlxuICogQGxpY2Vuc2UgcXJjb2RlLnJlYWN0XG4gKiBDb3B5cmlnaHQgKGMpIFBhdWwgTydTaGFubmVzc3lcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xudmFyIEVSUk9SX0xFVkVMX01BUCA9IHtcbiAgTDogcXJjb2RlZ2VuX2RlZmF1bHQuUXJDb2RlLkVjYy5MT1csXG4gIE06IHFyY29kZWdlbl9kZWZhdWx0LlFyQ29kZS5FY2MuTUVESVVNLFxuICBROiBxcmNvZGVnZW5fZGVmYXVsdC5RckNvZGUuRWNjLlFVQVJUSUxFLFxuICBIOiBxcmNvZGVnZW5fZGVmYXVsdC5RckNvZGUuRWNjLkhJR0hcbn07XG52YXIgREVGQVVMVF9TSVpFID0gMTI4O1xudmFyIERFRkFVTFRfTEVWRUwgPSBcIkxcIjtcbnZhciBERUZBVUxUX0JHQ09MT1IgPSBcIiNGRkZGRkZcIjtcbnZhciBERUZBVUxUX0ZHQ09MT1IgPSBcIiMwMDAwMDBcIjtcbnZhciBERUZBVUxUX0lOQ0xVREVNQVJHSU4gPSBmYWxzZTtcbnZhciBERUZBVUxUX01JTlZFUlNJT04gPSAxO1xudmFyIFNQRUNfTUFSR0lOX1NJWkUgPSA0O1xudmFyIERFRkFVTFRfTUFSR0lOX1NJWkUgPSAwO1xudmFyIERFRkFVTFRfSU1HX1NDQUxFID0gMC4xO1xuZnVuY3Rpb24gZ2VuZXJhdGVQYXRoKG1vZHVsZXMsIG1hcmdpbiA9IDApIHtcbiAgY29uc3Qgb3BzID0gW107XG4gIG1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbihyb3csIHkpIHtcbiAgICBsZXQgc3RhcnQgPSBudWxsO1xuICAgIHJvdy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIHgpIHtcbiAgICAgIGlmICghY2VsbCAmJiBzdGFydCAhPT0gbnVsbCkge1xuICAgICAgICBvcHMucHVzaChcbiAgICAgICAgICBgTSR7c3RhcnQgKyBtYXJnaW59ICR7eSArIG1hcmdpbn1oJHt4IC0gc3RhcnR9djFIJHtzdGFydCArIG1hcmdpbn16YFxuICAgICAgICApO1xuICAgICAgICBzdGFydCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh4ID09PSByb3cubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgb3BzLnB1c2goYE0ke3ggKyBtYXJnaW59LCR7eSArIG1hcmdpbn0gaDF2MUgke3ggKyBtYXJnaW59emApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wcy5wdXNoKFxuICAgICAgICAgICAgYE0ke3N0YXJ0ICsgbWFyZ2lufSwke3kgKyBtYXJnaW59IGgke3ggKyAxIC0gc3RhcnR9djFIJHtzdGFydCArIG1hcmdpbn16YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNlbGwgJiYgc3RhcnQgPT09IG51bGwpIHtcbiAgICAgICAgc3RhcnQgPSB4O1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9wcy5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gZXhjYXZhdGVNb2R1bGVzKG1vZHVsZXMsIGV4Y2F2YXRpb24pIHtcbiAgcmV0dXJuIG1vZHVsZXMuc2xpY2UoKS5tYXAoKHJvdywgeSkgPT4ge1xuICAgIGlmICh5IDwgZXhjYXZhdGlvbi55IHx8IHkgPj0gZXhjYXZhdGlvbi55ICsgZXhjYXZhdGlvbi5oKSB7XG4gICAgICByZXR1cm4gcm93O1xuICAgIH1cbiAgICByZXR1cm4gcm93Lm1hcCgoY2VsbCwgeCkgPT4ge1xuICAgICAgaWYgKHggPCBleGNhdmF0aW9uLnggfHwgeCA+PSBleGNhdmF0aW9uLnggKyBleGNhdmF0aW9uLncpIHtcbiAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0SW1hZ2VTZXR0aW5ncyhjZWxscywgc2l6ZSwgbWFyZ2luLCBpbWFnZVNldHRpbmdzKSB7XG4gIGlmIChpbWFnZVNldHRpbmdzID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBudW1DZWxscyA9IGNlbGxzLmxlbmd0aCArIG1hcmdpbiAqIDI7XG4gIGNvbnN0IGRlZmF1bHRTaXplID0gTWF0aC5mbG9vcihzaXplICogREVGQVVMVF9JTUdfU0NBTEUpO1xuICBjb25zdCBzY2FsZSA9IG51bUNlbGxzIC8gc2l6ZTtcbiAgY29uc3QgdyA9IChpbWFnZVNldHRpbmdzLndpZHRoIHx8IGRlZmF1bHRTaXplKSAqIHNjYWxlO1xuICBjb25zdCBoID0gKGltYWdlU2V0dGluZ3MuaGVpZ2h0IHx8IGRlZmF1bHRTaXplKSAqIHNjYWxlO1xuICBjb25zdCB4ID0gaW1hZ2VTZXR0aW5ncy54ID09IG51bGwgPyBjZWxscy5sZW5ndGggLyAyIC0gdyAvIDIgOiBpbWFnZVNldHRpbmdzLnggKiBzY2FsZTtcbiAgY29uc3QgeSA9IGltYWdlU2V0dGluZ3MueSA9PSBudWxsID8gY2VsbHMubGVuZ3RoIC8gMiAtIGggLyAyIDogaW1hZ2VTZXR0aW5ncy55ICogc2NhbGU7XG4gIGNvbnN0IG9wYWNpdHkgPSBpbWFnZVNldHRpbmdzLm9wYWNpdHkgPT0gbnVsbCA/IDEgOiBpbWFnZVNldHRpbmdzLm9wYWNpdHk7XG4gIGxldCBleGNhdmF0aW9uID0gbnVsbDtcbiAgaWYgKGltYWdlU2V0dGluZ3MuZXhjYXZhdGUpIHtcbiAgICBsZXQgZmxvb3JYID0gTWF0aC5mbG9vcih4KTtcbiAgICBsZXQgZmxvb3JZID0gTWF0aC5mbG9vcih5KTtcbiAgICBsZXQgY2VpbFcgPSBNYXRoLmNlaWwodyArIHggLSBmbG9vclgpO1xuICAgIGxldCBjZWlsSCA9IE1hdGguY2VpbChoICsgeSAtIGZsb29yWSk7XG4gICAgZXhjYXZhdGlvbiA9IHsgeDogZmxvb3JYLCB5OiBmbG9vclksIHc6IGNlaWxXLCBoOiBjZWlsSCB9O1xuICB9XG4gIGNvbnN0IGNyb3NzT3JpZ2luID0gaW1hZ2VTZXR0aW5ncy5jcm9zc09yaWdpbjtcbiAgcmV0dXJuIHsgeCwgeSwgaCwgdywgZXhjYXZhdGlvbiwgb3BhY2l0eSwgY3Jvc3NPcmlnaW4gfTtcbn1cbmZ1bmN0aW9uIGdldE1hcmdpblNpemUoaW5jbHVkZU1hcmdpbiwgbWFyZ2luU2l6ZSkge1xuICBpZiAobWFyZ2luU2l6ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGguZmxvb3IobWFyZ2luU2l6ZSksIDApO1xuICB9XG4gIHJldHVybiBpbmNsdWRlTWFyZ2luID8gU1BFQ19NQVJHSU5fU0laRSA6IERFRkFVTFRfTUFSR0lOX1NJWkU7XG59XG5mdW5jdGlvbiB1c2VRUkNvZGUoe1xuICB2YWx1ZSxcbiAgbGV2ZWwsXG4gIG1pblZlcnNpb24sXG4gIGluY2x1ZGVNYXJnaW4sXG4gIG1hcmdpblNpemUsXG4gIGltYWdlU2V0dGluZ3MsXG4gIHNpemUsXG4gIGJvb3N0TGV2ZWxcbn0pIHtcbiAgbGV0IHFyY29kZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gdmFsdWVzLnJlZHVjZSgoYWNjdW0sIHYpID0+IHtcbiAgICAgIGFjY3VtLnB1c2goLi4ucXJjb2RlZ2VuX2RlZmF1bHQuUXJTZWdtZW50Lm1ha2VTZWdtZW50cyh2KSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBxcmNvZGVnZW5fZGVmYXVsdC5RckNvZGUuZW5jb2RlU2VnbWVudHMoXG4gICAgICBzZWdtZW50cyxcbiAgICAgIEVSUk9SX0xFVkVMX01BUFtsZXZlbF0sXG4gICAgICBtaW5WZXJzaW9uLFxuICAgICAgdm9pZCAwLFxuICAgICAgdm9pZCAwLFxuICAgICAgYm9vc3RMZXZlbFxuICAgICk7XG4gIH0sIFt2YWx1ZSwgbGV2ZWwsIG1pblZlcnNpb24sIGJvb3N0TGV2ZWxdKTtcbiAgY29uc3QgeyBjZWxscywgbWFyZ2luLCBudW1DZWxscywgY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MgfSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCBjZWxsczIgPSBxcmNvZGUuZ2V0TW9kdWxlcygpO1xuICAgIGNvbnN0IG1hcmdpbjIgPSBnZXRNYXJnaW5TaXplKGluY2x1ZGVNYXJnaW4sIG1hcmdpblNpemUpO1xuICAgIGNvbnN0IG51bUNlbGxzMiA9IGNlbGxzMi5sZW5ndGggKyBtYXJnaW4yICogMjtcbiAgICBjb25zdCBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5nczIgPSBnZXRJbWFnZVNldHRpbmdzKFxuICAgICAgY2VsbHMyLFxuICAgICAgc2l6ZSxcbiAgICAgIG1hcmdpbjIsXG4gICAgICBpbWFnZVNldHRpbmdzXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHM6IGNlbGxzMixcbiAgICAgIG1hcmdpbjogbWFyZ2luMixcbiAgICAgIG51bUNlbGxzOiBudW1DZWxsczIsXG4gICAgICBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5nczogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MyXG4gICAgfTtcbiAgfSwgW3FyY29kZSwgc2l6ZSwgaW1hZ2VTZXR0aW5ncywgaW5jbHVkZU1hcmdpbiwgbWFyZ2luU2l6ZV0pO1xuICByZXR1cm4ge1xuICAgIHFyY29kZSxcbiAgICBtYXJnaW4sXG4gICAgY2VsbHMsXG4gICAgbnVtQ2VsbHMsXG4gICAgY2FsY3VsYXRlZEltYWdlU2V0dGluZ3NcbiAgfTtcbn1cbnZhciBTVVBQT1JUU19QQVRIMkQgPSBmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBuZXcgUGF0aDJEKCkuYWRkUGF0aChuZXcgUGF0aDJEKCkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufSgpO1xudmFyIFFSQ29kZUNhbnZhcyA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIGZ1bmN0aW9uIFFSQ29kZUNhbnZhczIocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICAgIGNvbnN0IF9hID0gcHJvcHMsIHtcbiAgICAgIHZhbHVlLFxuICAgICAgc2l6ZSA9IERFRkFVTFRfU0laRSxcbiAgICAgIGxldmVsID0gREVGQVVMVF9MRVZFTCxcbiAgICAgIGJnQ29sb3IgPSBERUZBVUxUX0JHQ09MT1IsXG4gICAgICBmZ0NvbG9yID0gREVGQVVMVF9GR0NPTE9SLFxuICAgICAgaW5jbHVkZU1hcmdpbiA9IERFRkFVTFRfSU5DTFVERU1BUkdJTixcbiAgICAgIG1pblZlcnNpb24gPSBERUZBVUxUX01JTlZFUlNJT04sXG4gICAgICBib29zdExldmVsLFxuICAgICAgbWFyZ2luU2l6ZSxcbiAgICAgIGltYWdlU2V0dGluZ3NcbiAgICB9ID0gX2EsIGV4dHJhUHJvcHMgPSBfX29ialJlc3QoX2EsIFtcbiAgICAgIFwidmFsdWVcIixcbiAgICAgIFwic2l6ZVwiLFxuICAgICAgXCJsZXZlbFwiLFxuICAgICAgXCJiZ0NvbG9yXCIsXG4gICAgICBcImZnQ29sb3JcIixcbiAgICAgIFwiaW5jbHVkZU1hcmdpblwiLFxuICAgICAgXCJtaW5WZXJzaW9uXCIsXG4gICAgICBcImJvb3N0TGV2ZWxcIixcbiAgICAgIFwibWFyZ2luU2l6ZVwiLFxuICAgICAgXCJpbWFnZVNldHRpbmdzXCJcbiAgICBdKTtcbiAgICBjb25zdCBfYiA9IGV4dHJhUHJvcHMsIHsgc3R5bGUgfSA9IF9iLCBvdGhlclByb3BzID0gX19vYmpSZXN0KF9iLCBbXCJzdHlsZVwiXSk7XG4gICAgY29uc3QgaW1nU3JjID0gaW1hZ2VTZXR0aW5ncyA9PSBudWxsID8gdm9pZCAwIDogaW1hZ2VTZXR0aW5ncy5zcmM7XG4gICAgY29uc3QgX2NhbnZhcyA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBfaW1hZ2UgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3Qgc2V0Q2FudmFzUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAobm9kZSkgPT4ge1xuICAgICAgICBfY2FudmFzLmN1cnJlbnQgPSBub2RlO1xuICAgICAgICBpZiAodHlwZW9mIGZvcndhcmRlZFJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZm9yd2FyZGVkUmVmKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcndhcmRlZFJlZikge1xuICAgICAgICAgIGZvcndhcmRlZFJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtmb3J3YXJkZWRSZWZdXG4gICAgKTtcbiAgICBjb25zdCBbaXNJbWdMb2FkZWQsIHNldElzSW1hZ2VMb2FkZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IHsgbWFyZ2luLCBjZWxscywgbnVtQ2VsbHMsIGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzIH0gPSB1c2VRUkNvZGUoe1xuICAgICAgdmFsdWUsXG4gICAgICBsZXZlbCxcbiAgICAgIG1pblZlcnNpb24sXG4gICAgICBib29zdExldmVsLFxuICAgICAgaW5jbHVkZU1hcmdpbixcbiAgICAgIG1hcmdpblNpemUsXG4gICAgICBpbWFnZVNldHRpbmdzLFxuICAgICAgc2l6ZVxuICAgIH0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoX2NhbnZhcy5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gX2NhbnZhcy5jdXJyZW50O1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2VsbHNUb0RyYXcgPSBjZWxscztcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBfaW1hZ2UuY3VycmVudDtcbiAgICAgICAgY29uc3QgaGF2ZUltYWdlVG9SZW5kZXIgPSBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5ncyAhPSBudWxsICYmIGltYWdlICE9PSBudWxsICYmIGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgIT09IDAgJiYgaW1hZ2UubmF0dXJhbFdpZHRoICE9PSAwO1xuICAgICAgICBpZiAoaGF2ZUltYWdlVG9SZW5kZXIpIHtcbiAgICAgICAgICBpZiAoY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MuZXhjYXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBjZWxsc1RvRHJhdyA9IGV4Y2F2YXRlTW9kdWxlcyhcbiAgICAgICAgICAgICAgY2VsbHMsXG4gICAgICAgICAgICAgIGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLmV4Y2F2YXRpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzLndpZHRoID0gc2l6ZSAqIHBpeGVsUmF0aW87XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2l6ZSAvIG51bUNlbGxzICogcGl4ZWxSYXRpbztcbiAgICAgICAgY3R4LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBiZ0NvbG9yO1xuICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgbnVtQ2VsbHMsIG51bUNlbGxzKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGZnQ29sb3I7XG4gICAgICAgIGlmIChTVVBQT1JUU19QQVRIMkQpIHtcbiAgICAgICAgICBjdHguZmlsbChuZXcgUGF0aDJEKGdlbmVyYXRlUGF0aChjZWxsc1RvRHJhdywgbWFyZ2luKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNlbGxzLmZvckVhY2goZnVuY3Rpb24ocm93LCByZHgpIHtcbiAgICAgICAgICAgIHJvdy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGNkeCkge1xuICAgICAgICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdChjZHggKyBtYXJnaW4sIHJkeCArIG1hcmdpbiwgMSwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxjdWxhdGVkSW1hZ2VTZXR0aW5ncykge1xuICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLm9wYWNpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhdmVJbWFnZVRvUmVuZGVyKSB7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShcbiAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MueCArIG1hcmdpbixcbiAgICAgICAgICAgIGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLnkgKyBtYXJnaW4sXG4gICAgICAgICAgICBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5ncy53LFxuICAgICAgICAgICAgY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MuaFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgc2V0SXNJbWFnZUxvYWRlZChmYWxzZSk7XG4gICAgfSwgW2ltZ1NyY10pO1xuICAgIGNvbnN0IGNhbnZhc1N0eWxlID0gX19zcHJlYWRWYWx1ZXMoeyBoZWlnaHQ6IHNpemUsIHdpZHRoOiBzaXplIH0sIHN0eWxlKTtcbiAgICBsZXQgaW1nID0gbnVsbDtcbiAgICBpZiAoaW1nU3JjICE9IG51bGwpIHtcbiAgICAgIGltZyA9IC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBcImltZ1wiLFxuICAgICAgICB7XG4gICAgICAgICAgc3JjOiBpbWdTcmMsXG4gICAgICAgICAga2V5OiBpbWdTcmMsXG4gICAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSxcbiAgICAgICAgICBvbkxvYWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHNldElzSW1hZ2VMb2FkZWQodHJ1ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWY6IF9pbWFnZSxcbiAgICAgICAgICBjcm9zc09yaWdpbjogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MgPT0gbnVsbCA/IHZvaWQgMCA6IGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLmNyb3NzT3JpZ2luXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICBcImNhbnZhc1wiLFxuICAgICAgX19zcHJlYWRWYWx1ZXMoe1xuICAgICAgICBzdHlsZTogY2FudmFzU3R5bGUsXG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIHJlZjogc2V0Q2FudmFzUmVmLFxuICAgICAgICByb2xlOiBcImltZ1wiXG4gICAgICB9LCBvdGhlclByb3BzKVxuICAgICksIGltZyk7XG4gIH1cbik7XG5RUkNvZGVDYW52YXMuZGlzcGxheU5hbWUgPSBcIlFSQ29kZUNhbnZhc1wiO1xudmFyIFFSQ29kZVNWRyA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIGZ1bmN0aW9uIFFSQ29kZVNWRzIocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICAgIGNvbnN0IF9hID0gcHJvcHMsIHtcbiAgICAgIHZhbHVlLFxuICAgICAgc2l6ZSA9IERFRkFVTFRfU0laRSxcbiAgICAgIGxldmVsID0gREVGQVVMVF9MRVZFTCxcbiAgICAgIGJnQ29sb3IgPSBERUZBVUxUX0JHQ09MT1IsXG4gICAgICBmZ0NvbG9yID0gREVGQVVMVF9GR0NPTE9SLFxuICAgICAgaW5jbHVkZU1hcmdpbiA9IERFRkFVTFRfSU5DTFVERU1BUkdJTixcbiAgICAgIG1pblZlcnNpb24gPSBERUZBVUxUX01JTlZFUlNJT04sXG4gICAgICBib29zdExldmVsLFxuICAgICAgdGl0bGUsXG4gICAgICBtYXJnaW5TaXplLFxuICAgICAgaW1hZ2VTZXR0aW5nc1xuICAgIH0gPSBfYSwgb3RoZXJQcm9wcyA9IF9fb2JqUmVzdChfYSwgW1xuICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgXCJzaXplXCIsXG4gICAgICBcImxldmVsXCIsXG4gICAgICBcImJnQ29sb3JcIixcbiAgICAgIFwiZmdDb2xvclwiLFxuICAgICAgXCJpbmNsdWRlTWFyZ2luXCIsXG4gICAgICBcIm1pblZlcnNpb25cIixcbiAgICAgIFwiYm9vc3RMZXZlbFwiLFxuICAgICAgXCJ0aXRsZVwiLFxuICAgICAgXCJtYXJnaW5TaXplXCIsXG4gICAgICBcImltYWdlU2V0dGluZ3NcIlxuICAgIF0pO1xuICAgIGNvbnN0IHsgbWFyZ2luLCBjZWxscywgbnVtQ2VsbHMsIGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzIH0gPSB1c2VRUkNvZGUoe1xuICAgICAgdmFsdWUsXG4gICAgICBsZXZlbCxcbiAgICAgIG1pblZlcnNpb24sXG4gICAgICBib29zdExldmVsLFxuICAgICAgaW5jbHVkZU1hcmdpbixcbiAgICAgIG1hcmdpblNpemUsXG4gICAgICBpbWFnZVNldHRpbmdzLFxuICAgICAgc2l6ZVxuICAgIH0pO1xuICAgIGxldCBjZWxsc1RvRHJhdyA9IGNlbGxzO1xuICAgIGxldCBpbWFnZSA9IG51bGw7XG4gICAgaWYgKGltYWdlU2V0dGluZ3MgIT0gbnVsbCAmJiBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5ncyAhPSBudWxsKSB7XG4gICAgICBpZiAoY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MuZXhjYXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGNlbGxzVG9EcmF3ID0gZXhjYXZhdGVNb2R1bGVzKFxuICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgIGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLmV4Y2F2YXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGltYWdlID0gLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwiaW1hZ2VcIixcbiAgICAgICAge1xuICAgICAgICAgIGhyZWY6IGltYWdlU2V0dGluZ3Muc3JjLFxuICAgICAgICAgIGhlaWdodDogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MuaCxcbiAgICAgICAgICB3aWR0aDogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MudyxcbiAgICAgICAgICB4OiBjYWxjdWxhdGVkSW1hZ2VTZXR0aW5ncy54ICsgbWFyZ2luLFxuICAgICAgICAgIHk6IGNhbGN1bGF0ZWRJbWFnZVNldHRpbmdzLnkgKyBtYXJnaW4sXG4gICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogXCJub25lXCIsXG4gICAgICAgICAgb3BhY2l0eTogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3Mub3BhY2l0eSxcbiAgICAgICAgICBjcm9zc09yaWdpbjogY2FsY3VsYXRlZEltYWdlU2V0dGluZ3MuY3Jvc3NPcmlnaW5cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZmdQYXRoID0gZ2VuZXJhdGVQYXRoKGNlbGxzVG9EcmF3LCBtYXJnaW4pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFwic3ZnXCIsXG4gICAgICBfX3NwcmVhZFZhbHVlcyh7XG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIHZpZXdCb3g6IGAwIDAgJHtudW1DZWxsc30gJHtudW1DZWxsc31gLFxuICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgcm9sZTogXCJpbWdcIlxuICAgICAgfSwgb3RoZXJQcm9wcyksXG4gICAgICAhIXRpdGxlICYmIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgdGl0bGUpLFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFwicGF0aFwiLFxuICAgICAgICB7XG4gICAgICAgICAgZmlsbDogYmdDb2xvcixcbiAgICAgICAgICBkOiBgTTAsMCBoJHtudW1DZWxsc312JHtudW1DZWxsc31IMHpgLFxuICAgICAgICAgIHNoYXBlUmVuZGVyaW5nOiBcImNyaXNwRWRnZXNcIlxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZmlsbDogZmdDb2xvciwgZDogZmdQYXRoLCBzaGFwZVJlbmRlcmluZzogXCJjcmlzcEVkZ2VzXCIgfSksXG4gICAgICBpbWFnZVxuICAgICk7XG4gIH1cbik7XG5RUkNvZGVTVkcuZGlzcGxheU5hbWUgPSBcIlFSQ29kZVNWR1wiO1xuZXhwb3J0IHtcbiAgUVJDb2RlQ2FudmFzLFxuICBRUkNvZGVTVkdcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xudmFyIHBlcmNlbnRUd2VudGllcyA9IC8lMjAvZztcblxudmFyIEZvcm1hdCA9IHtcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6IEZvcm1hdC5SRkMzOTg2LFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6IEZvcm1hdC5SRkMxNzM4LFxuICAgIFJGQzM5ODY6IEZvcm1hdC5SRkMzOTg2XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd0VtcHR5QXJyYXlzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFsbG93U3BhcnNlOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGR1cGxpY2F0ZXM6ICdjb21iaW5lJyxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdERlcHRoOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJiMoXFxkKyk7L2csIGZ1bmN0aW9uICgkMCwgbnVtYmVyU3RyKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG51bWJlclN0ciwgMTApKTtcbiAgICB9KTtcbn07XG5cbnZhciBwYXJzZUFycmF5VmFsdWUgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmNvbW1hICYmIHZhbC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdmFsLnNwbGl0KCcsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbi8vIFRoaXMgaXMgd2hhdCBicm93c2VycyB3aWxsIHN1Ym1pdCB3aGVuIHRoZSDinJMgY2hhcmFjdGVyIG9jY3VycyBpbiBhblxuLy8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGJvZHkgYW5kIHRoZSBlbmNvZGluZyBvZiB0aGUgcGFnZSBjb250YWluaW5nXG4vLyB0aGUgZm9ybSBpcyBpc28tODg1OS0xLCBvciB3aGVuIHRoZSBzdWJtaXR0ZWQgZm9ybSBoYXMgYW4gYWNjZXB0LWNoYXJzZXRcbi8vIGF0dHJpYnV0ZSBvZiBpc28tODg1OS0xLiBQcmVzdW1hYmx5IGFsc28gd2l0aCBvdGhlciBjaGFyc2V0cyB0aGF0IGRvIG5vdCBjb250YWluXG4vLyB0aGUg4pyTIGNoYXJhY3Rlciwgc3VjaCBhcyB1cy1hc2NpaS5cbnZhciBpc29TZW50aW5lbCA9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpXG5cbi8vIFRoZXNlIGFyZSB0aGUgcGVyY2VudC1lbmNvZGVkIHV0Zi04IG9jdGV0cyByZXByZXNlbnRpbmcgYSBjaGVja21hcmssIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBhY3R1YWxseSBpcyB1dGYtOCBlbmNvZGVkLlxudmFyIGNoYXJzZXRTZW50aW5lbCA9ICd1dGY4PSVFMiU5QyU5Myc7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0geyBfX3Byb3RvX186IG51bGwgfTtcblxuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICBjbGVhblN0ciA9IGNsZWFuU3RyLnJlcGxhY2UoLyU1Qi9naSwgJ1snKS5yZXBsYWNlKC8lNUQvZ2ksICddJyk7XG4gICAgdmFyIGxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gSW5maW5pdHkgPyB1bmRlZmluZWQgOiBvcHRpb25zLnBhcmFtZXRlckxpbWl0O1xuICAgIHZhciBwYXJ0cyA9IGNsZWFuU3RyLnNwbGl0KG9wdGlvbnMuZGVsaW1pdGVyLCBsaW1pdCk7XG4gICAgdmFyIHNraXBJbmRleCA9IC0xOyAvLyBLZWVwIHRyYWNrIG9mIHdoZXJlIHRoZSB1dGY4IHNlbnRpbmVsIHdhcyBmb3VuZFxuICAgIHZhciBpO1xuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQ7XG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHBhcnRzW2ldLmluZGV4T2YoJ3V0Zjg9JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydHNbaV0gPT09IGNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ3V0Zi04JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW2ldID09PSBpc29TZW50aW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2lzby04ODU5LTEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGkgPSBwYXJ0cy5sZW5ndGg7IC8vIFRoZSBlc2xpbnQgc2V0dGluZ3MgZG8gbm90IGFsbG93IGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpID09PSBza2lwSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XG5cbiAgICAgICAgdmFyIGJyYWNrZXRFcXVhbHNQb3MgPSBwYXJ0LmluZGV4T2YoJ109Jyk7XG4gICAgICAgIHZhciBwb3MgPSBicmFja2V0RXF1YWxzUG9zID09PSAtMSA/IHBhcnQuaW5kZXhPZignPScpIDogYnJhY2tldEVxdWFsc1BvcyArIDE7XG5cbiAgICAgICAgdmFyIGtleSwgdmFsO1xuICAgICAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gdXRpbHMubWF5YmVNYXAoXG4gICAgICAgICAgICAgICAgcGFyc2VBcnJheVZhbHVlKHBhcnQuc2xpY2UocG9zICsgMSksIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlbmNvZGVkVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmRlY29kZXIoZW5jb2RlZFZhbCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ3ZhbHVlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgJiYgb3B0aW9ucy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgJiYgY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICB2YWwgPSBpbnRlcnByZXROdW1lcmljRW50aXRpZXModmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoJ1tdPScpID4gLTEpIHtcbiAgICAgICAgICAgIHZhbCA9IGlzQXJyYXkodmFsKSA/IFt2YWxdIDogdmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4aXN0aW5nID0gaGFzLmNhbGwob2JqLCBrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnY29tYmluZScpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmcgfHwgb3B0aW9ucy5kdXBsaWNhdGVzID09PSAnbGFzdCcpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICB2YXIgbGVhZiA9IHZhbHVlc1BhcnNlZCA/IHZhbCA6IHBhcnNlQXJyYXlWYWx1ZSh2YWwsIG9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBvYmo7XG4gICAgICAgIHZhciByb290ID0gY2hhaW5baV07XG5cbiAgICAgICAgaWYgKHJvb3QgPT09ICdbXScgJiYgb3B0aW9ucy5wYXJzZUFycmF5cykge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzICYmIChsZWFmID09PSAnJyB8fCAob3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgJiYgbGVhZiA9PT0gbnVsbCkpXG4gICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgIDogW10uY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgZGVjb2RlZFJvb3QgPSBvcHRpb25zLmRlY29kZURvdEluS2V5cyA/IGNsZWFuUm9vdC5yZXBsYWNlKC8lMkUvZywgJy4nKSA6IGNsZWFuUm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGRlY29kZWRSb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgZGVjb2RlZFJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIFN0cmluZyhpbmRleCkgPT09IGRlY29kZWRSb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVkUm9vdCAhPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICBvYmpbZGVjb2RlZFJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IG9wdGlvbnMuZGVwdGggPiAwICYmIGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChvcHRpb25zLmRlcHRoID4gMCAmJiAoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwgY2hlY2sgc3RyaWN0RGVwdGggb3B0aW9uIGZvciB0aHJvdywgZWxzZSBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpY3REZXB0aCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0lucHV0IGRlcHRoIGV4Y2VlZGVkIGRlcHRoIG9wdGlvbiBvZiAnICsgb3B0aW9ucy5kZXB0aCArICcgYW5kIHN0cmljdERlcHRoIGlzIHRydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZGVjb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgdmFyIGR1cGxpY2F0ZXMgPSB0eXBlb2Ygb3B0cy5kdXBsaWNhdGVzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmR1cGxpY2F0ZXMgOiBvcHRzLmR1cGxpY2F0ZXM7XG5cbiAgICBpZiAoZHVwbGljYXRlcyAhPT0gJ2NvbWJpbmUnICYmIGR1cGxpY2F0ZXMgIT09ICdmaXJzdCcgJiYgZHVwbGljYXRlcyAhPT0gJ2xhc3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBkdXBsaWNhdGVzIG9wdGlvbiBtdXN0IGJlIGVpdGhlciBjb21iaW5lLCBmaXJzdCwgb3IgbGFzdCcpO1xuICAgIH1cblxuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gb3B0cy5kZWNvZGVEb3RJbktleXMgPT09IHRydWUgPyB0cnVlIDogZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93RG90czogYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd0VtcHR5QXJyYXlzOiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzID09PSAnYm9vbGVhbicgPyAhIW9wdHMuYWxsb3dFbXB0eUFycmF5cyA6IGRlZmF1bHRzLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgIGFsbG93UHJvdG90eXBlczogdHlwZW9mIG9wdHMuYWxsb3dQcm90b3R5cGVzID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93UHJvdG90eXBlcyA6IGRlZmF1bHRzLmFsbG93UHJvdG90eXBlcyxcbiAgICAgICAgYWxsb3dTcGFyc2U6IHR5cGVvZiBvcHRzLmFsbG93U3BhcnNlID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93U3BhcnNlIDogZGVmYXVsdHMuYWxsb3dTcGFyc2UsXG4gICAgICAgIGFycmF5TGltaXQ6IHR5cGVvZiBvcHRzLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0cy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdCxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBjb21tYTogdHlwZW9mIG9wdHMuY29tbWEgPT09ICdib29sZWFuJyA/IG9wdHMuY29tbWEgOiBkZWZhdWx0cy5jb21tYSxcbiAgICAgICAgZGVjb2RlRG90SW5LZXlzOiB0eXBlb2Ygb3B0cy5kZWNvZGVEb3RJbktleXMgPT09ICdib29sZWFuJyA/IG9wdHMuZGVjb2RlRG90SW5LZXlzIDogZGVmYXVsdHMuZGVjb2RlRG90SW5LZXlzLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLWV4dHJhLXBhcmVuc1xuICAgICAgICBkZXB0aDogKHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyB8fCBvcHRzLmRlcHRoID09PSBmYWxzZSkgPyArb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBkdXBsaWNhdGVzOiBkdXBsaWNhdGVzLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0RGVwdGg6IHR5cGVvZiBvcHRzLnN0cmljdERlcHRoID09PSAnYm9vbGVhbicgPyAhIW9wdHMuc3RyaWN0RGVwdGggOiBkZWZhdWx0cy5zdHJpY3REZXB0aCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0Rm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xudmFyIGRlZmF1bHRzID0ge1xuICAgIGFkZFF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93RW1wdHlBcnJheXM6IGZhbHNlLFxuICAgIGFycmF5Rm9ybWF0OiAnaW5kaWNlcycsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGVuY29kZTogdHJ1ZSxcbiAgICBlbmNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIGFsbG93RW1wdHlBcnJheXMsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVEb3RJbktleXMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBpZiAoZW5jb2RlVmFsdWVzT25seSAmJiBlbmNvZGVyKSB7XG4gICAgICAgICAgICBvYmogPSB1dGlscy5tYXliZU1hcChvYmosIGVuY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIG9iaktleXMgPSBbeyB2YWx1ZTogb2JqLmxlbmd0aCA+IDAgPyBvYmouam9pbignLCcpIHx8IG51bGwgOiB2b2lkIHVuZGVmaW5lZCB9XTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIHZhciBlbmNvZGVkUHJlZml4ID0gZW5jb2RlRG90SW5LZXlzID8gcHJlZml4LnJlcGxhY2UoL1xcLi9nLCAnJTJFJykgOiBwcmVmaXg7XG5cbiAgICB2YXIgYWRqdXN0ZWRQcmVmaXggPSBjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMSA/IGVuY29kZWRQcmVmaXggKyAnW10nIDogZW5jb2RlZFByZWZpeDtcblxuICAgIGlmIChhbGxvd0VtcHR5QXJyYXlzICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBhZGp1c3RlZFByZWZpeCArICdbXSc7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmpLZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2pdO1xuICAgICAgICB2YXIgdmFsdWUgPSB0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJiB0eXBlb2Yga2V5LnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IGtleS52YWx1ZSA6IG9ialtrZXldO1xuXG4gICAgICAgIGlmIChza2lwTnVsbHMgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVuY29kZWRLZXkgPSBhbGxvd0RvdHMgJiYgZW5jb2RlRG90SW5LZXlzID8ga2V5LnJlcGxhY2UoL1xcLi9nLCAnJTJFJykgOiBrZXk7XG4gICAgICAgIHZhciBrZXlQcmVmaXggPSBpc0FycmF5KG9iailcbiAgICAgICAgICAgID8gdHlwZW9mIGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdmdW5jdGlvbicgPyBnZW5lcmF0ZUFycmF5UHJlZml4KGFkanVzdGVkUHJlZml4LCBlbmNvZGVkS2V5KSA6IGFkanVzdGVkUHJlZml4XG4gICAgICAgICAgICA6IGFkanVzdGVkUHJlZml4ICsgKGFsbG93RG90cyA/ICcuJyArIGVuY29kZWRLZXkgOiAnWycgKyBlbmNvZGVkS2V5ICsgJ10nKTtcblxuICAgICAgICBzaWRlQ2hhbm5lbC5zZXQob2JqZWN0LCBzdGVwKTtcbiAgICAgICAgdmFyIHZhbHVlU2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgICAgICB2YWx1ZVNpZGVDaGFubmVsLnNldChzZW50aW5lbCwgc2lkZUNoYW5uZWwpO1xuICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5UHJlZml4LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgIGVuY29kZURvdEluS2V5cyxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgZW5jb2RlVmFsdWVzT25seSAmJiBpc0FycmF5KG9iaikgPyBudWxsIDogZW5jb2RlcixcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgIGNoYXJzZXQsXG4gICAgICAgICAgICB2YWx1ZVNpZGVDaGFubmVsXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG52YXIgbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGVuY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5jb2RlciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgZGVmYXVsdHMuY2hhcnNldDtcbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICBpZiAodHlwZW9mIG9wdHMuZm9ybWF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoIWhhcy5jYWxsKGZvcm1hdHMuZm9ybWF0dGVycywgb3B0cy5mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGZvcm1hdCBvcHRpb24gcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0ID0gb3B0cy5mb3JtYXQ7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcblxuICAgIHZhciBmaWx0ZXIgPSBkZWZhdWx0cy5maWx0ZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0FycmF5KG9wdHMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdHMuYXJyYXlGb3JtYXQgaW4gYXJyYXlQcmVmaXhHZW5lcmF0b3JzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5hcnJheUZvcm1hdDtcbiAgICB9IGVsc2UgaWYgKCdpbmRpY2VzJyBpbiBvcHRzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBkZWZhdWx0cy5hcnJheUZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAoJ2NvbW1hUm91bmRUcmlwJyBpbiBvcHRzICYmIHR5cGVvZiBvcHRzLmNvbW1hUm91bmRUcmlwICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGNvbW1hUm91bmRUcmlwYCBtdXN0IGJlIGEgYm9vbGVhbiwgb3IgYWJzZW50Jyk7XG4gICAgfVxuXG4gICAgdmFyIGFsbG93RG90cyA9IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBvcHRzLmVuY29kZURvdEluS2V5cyA9PT0gdHJ1ZSA/IHRydWUgOiBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkUXVlcnlQcmVmaXg6IHR5cGVvZiBvcHRzLmFkZFF1ZXJ5UHJlZml4ID09PSAnYm9vbGVhbicgPyBvcHRzLmFkZFF1ZXJ5UHJlZml4IDogZGVmYXVsdHMuYWRkUXVlcnlQcmVmaXgsXG4gICAgICAgIGFsbG93RG90czogYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd0VtcHR5QXJyYXlzOiB0eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzID09PSAnYm9vbGVhbicgPyAhIW9wdHMuYWxsb3dFbXB0eUFycmF5cyA6IGRlZmF1bHRzLmFsbG93RW1wdHlBcnJheXMsXG4gICAgICAgIGFycmF5Rm9ybWF0OiBhcnJheUZvcm1hdCxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBjb21tYVJvdW5kVHJpcDogb3B0cy5jb21tYVJvdW5kVHJpcCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlRG90SW5LZXlzOiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzIDogZGVmYXVsdHMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICBlbmNvZGVyOiB0eXBlb2Ygb3B0cy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcixcbiAgICAgICAgZW5jb2RlVmFsdWVzT25seTogdHlwZW9mIG9wdHMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcixcbiAgICAgICAgc2VyaWFsaXplRGF0ZTogdHlwZW9mIG9wdHMuc2VyaWFsaXplRGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc2VyaWFsaXplRGF0ZSA6IGRlZmF1bHRzLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgIHNraXBOdWxsczogdHlwZW9mIG9wdHMuc2tpcE51bGxzID09PSAnYm9vbGVhbicgPyBvcHRzLnNraXBOdWxscyA6IGRlZmF1bHRzLnNraXBOdWxscyxcbiAgICAgICAgc29ydDogdHlwZW9mIG9wdHMuc29ydCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc29ydCA6IG51bGwsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKTtcblxuICAgIHZhciBvYmpLZXlzO1xuICAgIHZhciBmaWx0ZXI7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmogPSBmaWx0ZXIoJycsIG9iaik7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG9wdGlvbnMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbb3B0aW9ucy5hcnJheUZvcm1hdF07XG4gICAgdmFyIGNvbW1hUm91bmRUcmlwID0gZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBvcHRpb25zLmNvbW1hUm91bmRUcmlwO1xuXG4gICAgaWYgKCFvYmpLZXlzKSB7XG4gICAgICAgIG9iaktleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gICAgfVxuXG4gICAgdmFyIHNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9BcnJheShrZXlzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgb3B0aW9ucy5za2lwTnVsbHMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZURvdEluS2V5cyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlID8gb3B0aW9ucy5lbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5zb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0RvdHMsXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0dGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgb3B0aW9ucy5jaGFyc2V0LFxuICAgICAgICAgICAgc2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKSwgdGhlIFwibnVtZXJpYyBlbnRpdHlcIiByZXByZXNlbnRhdGlvbiBvZiBhIGNoZWNrbWFya1xuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JUUyJTlDJTkzJic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIC8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBsaW1pdCA9IDEwMjQ7XG5cbi8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuXG52YXIgZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZGVmYXVsdEVuY29kZXIsIGNoYXJzZXQsIGtpbmQsIGZvcm1hdCkge1xuICAgIC8vIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJyaWFuIFdoaXRlIChtc2NkZXgpIGZvciB0aGUgaW8uanMgY29yZSBxdWVyeXN0cmluZyBsaWJyYXJ5LlxuICAgIC8vIEl0IGhhcyBiZWVuIGFkYXB0ZWQgaGVyZSBmb3Igc3RyaWN0ZXIgYWRoZXJlbmNlIHRvIFJGQyAzOTg2XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICB2YXIgc3RyaW5nID0gc3RyO1xuICAgIGlmICh0eXBlb2Ygc3RyID09PSAnc3ltYm9sJykge1xuICAgICAgICBzdHJpbmcgPSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3RyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmluZyA9IFN0cmluZyhzdHIpO1xuICAgIH1cblxuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyV1WzAtOWEtZl17NH0vZ2ksIGZ1bmN0aW9uICgkMCkge1xuICAgICAgICAgICAgcmV0dXJuICclMjYlMjMnICsgcGFyc2VJbnQoJDAuc2xpY2UoMiksIDE2KSArICclM0InO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHJpbmcubGVuZ3RoOyBqICs9IGxpbWl0KSB7XG4gICAgICAgIHZhciBzZWdtZW50ID0gc3RyaW5nLmxlbmd0aCA+PSBsaW1pdCA/IHN0cmluZy5zbGljZShqLCBqICsgbGltaXQpIDogc3RyaW5nO1xuICAgICAgICB2YXIgYXJyID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHNlZ21lbnQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgICAgICAgICB8fCAoZm9ybWF0ID09PSBmb3JtYXRzLlJGQzE3MzggJiYgKGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOSkpIC8vICggKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gc2VnbWVudC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc2VnbWVudC5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcblxuICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgICAgIH1cblxuICAgICAgICBvdXQgKz0gYXJyLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG52YXIgbWF5YmVNYXAgPSBmdW5jdGlvbiBtYXliZU1hcCh2YWwsIGZuKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICB2YXIgbWFwcGVkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBtYXBwZWQucHVzaChmbih2YWxbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICByZXR1cm4gZm4odmFsKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGFycmF5VG9PYmplY3Q6IGFycmF5VG9PYmplY3QsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgY29tYmluZTogY29tYmluZSxcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWF5YmVNYXA6IG1heWJlTWFwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=